Djangoでmod_wsgiを使ってBASIC認証とか。

 先日のの続きと言えば続きでありますし、そうではないと言えばそうではありません。当たり前です。

 前回は Django の機能である Middleware を用いてリクエスト時にフックして認証を行うみたいなやり方を参照させていただきましたけど(例のあれ(仮題)- DjangoでBASIC認証とかHTTPSスキーム強制とか。)、似たような仕組みが WSGI にありまして mod_wsgi 経由で使えるってんでやってみました。あと、こちらを使うと Django の User で認証もできるっていうのもなかなかにありがたいのでこれも採用。

 Authenticating against Django’s user database from Apache | Django documentation | Django

 公式にきちんとドキュメント化されておりますので基本的には迷いようはないのですけど、今回導入先のサーバーさまにおきましては daemon mode と virtualenv を使って複数の Python 環境で複数の Django アプリを設置(How to use Django with Apache and mod_wsgi | Django documentation | Django)している関係上上手く動かせなかったのですよね。や、多分そういうものなんじゃないかと思うんですよ、よくわかっていないので間違っているとも思いますけど。

 具体的には WSGIAuthUserScript に process-group を渡す方法がわからなくて動かなかったんです、Django へ python-path を通すことができなくて「 import できないし」とか怒られるあれ。そんなのパスが通っているところに Django を設置すればいいし、起動スクリプトを書き換えてパスを通しちゃえばいいじゃない。と思いますよね、思いますよ、思いますけどそんなの嫌じゃない、なんか負けた気するじゃない、設定とかでなんとかしたいじゃない。

 とかであれこれ試してみましたけど、結局無理で Django アプリケーション側の wsgi.py を書き換えたのですけどね……。

import os
import sys

sys.path.append('`Django アプリケーションへのパス`')
sys.path.append('`virtualenvの環境へのパス`/lib/python2.7/site-packages')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "`プロジェクト名`.settings")

from django.contrib.auth.handlers.modwsgi import check_password

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

 底辺おじさんはこの程度のことでうおさおできておめでたい日々である。