在对安全较高的网站中,我们要求连接必须使用ssl加密,除了在如nginx这样的HTTP服务器中做相关配置以外,可能还会涉及在Django中做安全连接的要求,即将用户的http连接重定向到https。有以下一些方法可以满足相关需求:
一、中间件的使用:
在Django中很容易编写自定义中间件以在请求到达视图之前被调用。下面是一个中间件的示例,其可以检测一个请求是否要求安全的连接,如果需要则进行重定向操作:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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())
return
HttpResponsePermanentRedirect(secure_url)
return
None
|
接下来,我们需要在settings.py中的MIDDLEWARE_CLASSES字段内加入该中间件:
1
2
3
|
...
'myproject.middleware.SecureRequiredMiddleware'
,
)
|
并增加配置项:
1
2
3
4
5
6
|
SECURE_REQUIRED_PATHS = (
'/admin/'
,
'/accounts/'
,
'/management/'
,
...
)
|
其中SECURE_REQUIRED_PATHS为一个列表或元祖,包含要求安全连接的所有路径;HTTPS_SUPPORT是一个开关,可以自定义是否开启ssl支持。
二、在一个具体的视图上要求https连接:
更多的时候,我们也许只需要在少数的几个视图中要求https连接,这时使用装饰器也许是更理想的方法,以下这个装饰器secure_required即可达到这个目的:
1
2
3
4
5
6
7
8
9
10
11
12
|
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())
return
HttpResponseRedirect(secure_url)
return
view_func(request,
*
args,
*
*
kwargs)
return
_wrapped_view_func
|
参考资料(以上的内容也部分来自于此):