DjangoSSL서비스하기.

Apache 인증서 설정까지 다 끝났다는 가정하에,

SSL 적용

데이터 암호화가 필요한 폼 제출 부분의 action 링크를 https 로 수정한다. (보통은 이 작업만 하면 끝이지만,)

일반적으로 Django에서는 같은 view가 폼 표시와 폼 처리를 보통 같이 수행한다. 그러다 보니, 폼 체크 실패 이후, 계속 https 로 연결된다.

SSL redirect 미들웨어 적용

SSL Middleware를 적용하면, urls.py 에 표시한 view에 대해 자동으로 SSL redirection 을 수행한 뒤, 자동으로 비 보안 연결로 복귀된다.

하지만, 위 코드는 SSL 포트가 443으로 변하지 않을 경우에만 동작한다. 만일 다른 SSL 포트를 써야 한다면 settings.py 에 SSL_PORT 를 명기한 뒤 아래처럼,

   1 __license__ = "Python"
   2 __copyright__ = "Copyright (C) 2007, Stephen Zabel"
   3 __author__ = "Stephen Zabel - sjzabel@gmail.com"
   4 __contributors__ = "Jay Parlar - parlar@gmail.com"
   5 
   6 from django.conf import settings
   7 from django.http import HttpResponseRedirect, HttpResponsePermanentRedirect, get_host
   8 
   9 SSL = 'SSL'
  10 
  11 class SSLRedirect:
  12     def process_view(self, request, view_func, view_args, view_kwargs):
  13         if SSL in view_kwargs:
  14             secure = view_kwargs[SSL]
  15             del view_kwargs[SSL]
  16         else:
  17             secure = False
  18 
  19         if not secure == self._is_secure(request):
  20             return self._redirect(request, secure)
  21 
  22     def _is_secure(self, request):
  23         if request.is_secure():
  24             return True
  25 
  26         #Handle the Webfaction case until this gets resolved in the request.is_secure()
  27         if 'HTTP_X_FORWARDED_SSL' in request.META:
  28             return request.META['HTTP_X_FORWARDED_SSL'] == 'on'
  29 
  30         return False
  31 
  32     def _redirect(self, request, secure):
  33         protocol = secure and "https" or "http"
  34         ssl_port = ''
  35         if hasattr(settings, 'SSL_PORT'):
  36             ssl_port = ":%s" % settings.SSL_PORT
  37         if protocol == 'http':
  38             ssl_port = ''
  39         newurl = "%s://%s%s%s" % (
  40                 protocol,get_host(request).split(':')[0],
  41                 ssl_port,
  42                 request.get_full_path(),
  43                 )
  44         if settings.DEBUG and request.method == 'POST':
  45             raise RuntimeError, \
  46         """Django can't perform a SSL redirect while maintaining POST data.
  47            Please structure your views so that redirects only occur during GETs."""
  48 
  49         return HttpResponsePermanentRedirect(newurl)

DjangoAndSsl (last edited 2011-11-24 17:56:36 by 203)

web biohackers.net