BLOG
Enjoy when you can, and endure when you must.
APR 25, 2013/Django
在Django中要求https连接

在对安全较高的网站中,我们要求连接必须使用ssl加密,除了在如nginx这样的HTTP服务器中做相关配置以外,可能还会涉及在Django中做安全连接的要求,即将用户的http连接重定向到https。有以下一些方法可以满足相关需求:

一、中间件的使用:

在Django中很容易编写自定义中间件以在请求到达视图之前被调用。下面是一个中间件的示例,其可以检测一个请求是否要求安全的连接,如果需要则进行重定向操作:

from django.conf import settings
  
class SecureRequiredMiddleware(object):
    def __init__(self):
        self.paths = getattr(settings, 'SECURE_REQUIRED_PATHS')
        self.enabled = self.paths and getattr(settings, 'HTTPS_SUPPORT')
  
    def process_request(self, request):
        if self.enabled and not request.is_secure():
            for path in self.paths:
                if request.get_full_path().startswith(path):
                    request_url = request.build_absolute_uri(request.get_full_path())
                    secure_url = request_url.replace('http://', 'https://')
                    return HttpResponsePermanentRedirect(secure_url)
        return None

接下来,我们需要在settings.py中的MIDDLEWARE_CLASSES字段内加入该中间件:

    ...
    'myproject.middleware.SecureRequiredMiddleware',
)

并增加配置项:

SECURE_REQUIRED_PATHS = (
    '/admin/',
    '/accounts/',
    '/management/',
    ...
)

其中SECURE_REQUIRED_PATHS为一个列表或元祖,包含要求安全连接的所有路径;HTTPS_SUPPORT是一个开关,可以自定义是否开启ssl支持。

二、在一个具体的视图上要求https连接:

更多的时候,我们也许只需要在少数的几个视图中要求https连接,这时使用装饰器也许是更理想的方法,以下这个装饰器secure_required即可达到这个目的:

from django.http import HttpResponseRedirect
  
def secure_required(view_func):
    """Decorator makes sure URL is accessed over https."""
    def _wrapped_view_func(request, *args, **kwargs):
        if not request.is_secure():
            if getattr(settings, 'HTTPS_SUPPORT', True):
                request_url = request.build_absolute_uri(request.get_full_path())
                secure_url = request_url.replace('http://', 'https://')
                return HttpResponseRedirect(secure_url)
        return view_func(request, *args, **kwargs)
    return _wrapped_view_func

参考资料(以上的内容也部分来自于此):

Securing Django with SSL

Requiring https for certain paths in Django

COMMENTS
21/08From 18855885588

1111

21/08From 18855885588

1

07/07From Danny

@张荣发: 回复比较长,已通过邮件发送到你的邮箱。

07/07From 张荣发

配置完,会把针对 http 访问页面的请求重定向到 https 访问,但是django是在 http上启动的,
这样做无法访问页面

LEAVE COMMNT