Djangoですべてのリクエストに対してhttpsリクエストを強制するとか、あるホストにきたリクエストを他のホストにリダイレクトするといったことをしたくなる時がある。こんな時はミドルウェアを作成するのが便利(RailsだとRackとかがそれにあたるのかな?よく知らん)
Stackoverflowの記事で、
- Heroku Django: Redirect all requests for www. to root domain - Stack Overflow
- How to make python on Heroku https only? - Stack Overflow
とかのページが非常に参考になった。
自分の場合
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の情報調べても日本語ほとんど引っかからないの非常に残念