def yasuharu519(self):

日々の妄想

Django のミドルウェア開発

Djangoですべてのリクエストに対してhttpsリクエストを強制するとか、あるホストにきたリクエストを他のホストにリダイレクトするといったことをしたくなる時がある。こんな時はミドルウェアを作成するのが便利(RailsだとRackとかがそれにあたるのかな?よく知らん)

Stackoverflowの記事で、

とかのページが非常に参考になった。

自分の場合

from django.http import HttpResponsePermanentRedirect
from django.conf import settings

class SecureRequiredMiddleware(object):
    def __init__(self):
        self.enabled = getattr(settings, 'HTTPS_SUPPORT')

    def process_request(self, request):
        if self.enabled and not request.is_secure():
            request_url = request.build_absolute_uri(request.get_full_path())
            secure_url = request_url.replace('http://', 'https://')
            return HttpResponsePermanentRedirect(secure_url)
        return None

class WWWRedirectMiddleware(object):
    def process_request(self, request):
        if request.META['HTTP_HOST'].startswith('example.com'):
            request_url = request.build_absolute_uri(request.get_full_path())
            redirect_url = request_url.replace('example', 'www.example', 1)
            return HttpResponsePermanentRedirect(redirect_url)

みたいな感じで、SecureRequiredMiddlewareクラスと、WWWRedirectMiddlewareクラスをmiddleware.pyに用意して、settings.pyにて

MIDDLEWARE_CLASSES = (
    'projectname.middleware.SecureRequiredMiddleware',
    'projectname.middleware.WWWRedirectMiddleware',
)

とすることで、SecureRequiredMiddlewareでは、httpへのアクセスをすべてhttpsへのアクセスへとかえ、WWWRedirectMiddlewareでは、example.comへのアクセスをすべてwww.example.comへ向くように変えている。

ミドルウェアの付け加えだけで、リクエストの処理を変化させれるの非常に便利。

それにしてもDjangoの情報調べても日本語ほとんど引っかからないの非常に残念