#背景
DjangoでSSOするためにRemoteUserMiddlewareを使おうとしたら、下記のエラーが出る。
ValueError at set_wakeup_fd only works in main thread
しかもリロードするたびに出たり出なかったりする奇怪な現象。
#環境
- Windows Server 2016 64bit
- Python 3.8.2
- Django 3.0
- Apache 2.4 + mod_wsgi + mod_shib
- Shibboleth2(今回、直接の関係はない)
#原因
どうやらmod_wsgiのバグ。技術力不足により、理屈は追わない。
ValueError: set_wakeup_fd only works in main thread #143
set_wakeup_fd only works in main thread #156
#対処
2020/5/4時点で根本的には未解決。
仕方なく、この人がやったようにPython3.8.2をPython3.7.7に下げる。
##1. Python3.7.7をインストール
https://www.python.org/downloads/windows/
このへんから持ってきてインストール。
PATHに設定するというチェックボックスは外しておいたほうがよい。
##2. 上記に対応するmod_wsgiをインストール
Python Windows で mod_wsgi を Apache に組み込む方法
いつもお世話になっている記事↑と、それをもとに書いた記事↓。
Django + Apache with mod_wsgi on Windows Server 2016
##3. DjangoのPython Interpreterを変更
環境によって異なるが、PyCharmでは次の通り。
SettingsのProject InterpreterでAddを選択(右端、切れてしまった…)
Python3.7のInterpreterを選択して、Locationフォルダを適当に変更(今回、安直に"venv2"とした)
あとはPackageの「+」ボタンを押してDjangoをインストール。
(しないと、Django関係の識別子がすべてUnresolved referenceになって動かない)
##4. Apacheのhttpd.confにある関係項目を変更
##python3.8.2
#LoadFile "c:/program files/python38/python38.dll"
#LoadModule wsgi_module "c:/program files/python38/lib/site-packages/mod_wsgi/server/mod_wsgi.cp38-win_amd64.pyd"
#WSGIPythonHome "c:/program files/python38"
#python3.7.7
LoadFile "c:/users/administrator/appdata/local/programs/python/python37/python37.dll"
LoadModule wsgi_module "c:/users/administrator/appdata/local/programs/python/python37/lib/site-packages/mod_wsgi/server/mod_wsgi.cp37-win_amd64.pyd"
WSGIPythonHome "c:/users/administrator/appdata/local/programs/python/python37"
なお、フォルダ構成は各自の環境に従う。
ちなみにこれらは、
> mod_wsgi-express module-config
コマンドで出力される内容をコピペすると楽。
WSGIPythonPathの変更も忘れずに。
##python3.8.2
#WSGIPythonPath d:/apps/shib_test/venv/Lib/site-packages
#python3.7.7
WSGIPythonPath d:/apps/shib_test/venv2/Lib/site-packages
あとはApacheを再起動して完了。