在对安全较高的网站中,我们要求连接必须使用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
参考资料(以上的内容也部分来自于此):
1111
1
@张荣发: 回复比较长,已通过邮件发送到你的邮箱。
配置完,会把针对 http 访问页面的请求重定向到 https 访问,但是django是在 http上启动的,
这样做无法访问页面