やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

ラズパイ4B bookworm Python 3.11 CORSエラーを解決するHTTPSローカルサーバを建てる

 WebAPIを叩いたりする時に必要。

以前

 上記がbookwormだと動作しない。Pythonが新しくなったせいらしい。

ラズパイOS Debian Python Chromium
2020-08-20 10 buster 3.7 92
2025-05-13 12 bookworm 3.11 136

情報源

今回

 WebAPIを叩く時などに使うローカルサーバを建てる。

  • server.sh
  • run_server.py

server.sh

#!/usr/bin/env bash
set -Ceu
#---------------------------------------------------------------------------
# HTTPローカルサーバを起動する
#---------------------------------------------------------------------------
Run() {
    THIS="$(realpath "${BASH_SOURCE:-0}")"; HERE="$(dirname "$THIS")"; PARENT="$(dirname "$HERE")"; THIS_NAME="$(basename "$THIS")"; APP_ROOT="$PARENT";
    cd "$HERE"
    PEM=cert.pem
    SERVER=run_server.py
    makePem() {
        openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes -subj "/CN=localhost"
    }
    Https() {
        [ ! -f "./$PEM" ] && makePem || :
        URL="https://localhost:8000/"
        firefox "$URL"
        sudo python3 $SERVER
    }
    Https
}
Run "$@"

 実行権限も付与しておく。

chmod +x server.sh

run_server.py

from http.server import HTTPServer, SimpleHTTPRequestHandler
import ssl
import socketserver
import os

class CORSRequestHandler (SimpleHTTPRequestHandler):
    def end_headers (self):
        self.send_header('Access-Control-Allow-Origin', '*')
        SimpleHTTPRequestHandler.end_headers(self)

httpd = socketserver.TCPServer(('localhost', 8000), CORSRequestHandler )

context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain(certfile='cert.pem', keyfile='key.pem')

httpd.socket = context.wrap_socket(httpd.socket, server_side=True)

print("Serving HTTPS on https://localhost:8000")
httpd.serve_forever()

実行

./server.sh

 これでfirefoxが起動するので、危険を承知でアクセスする的なUI操作をしてlocalhostページを閲覧する。

所感

 Pythonには本当に手を焼かされる。なるだけ依存したくないが、他に代用できそうな奴もいないので使わざるを得ない。

 Node.jsでサーバ建てるならもっと大量のコードやファイルを必要としたりしてサイズも肥大化しそう。

 多分このPythonのが一番簡単にHTTPSローカルサーバを建てる方法。