在Django中要求https连接

在对安全较高的网站中,我们要求连接必须使用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())
                     secure_url  =  request_url.replace( 'http://' 'https://' )
                     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())
                 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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值