django 实现未经登录验证的url过滤
2014-04-06 17:24
417 查看
本人在做一个基于sae的在线学习系统,语言使用的python,web框架用的是django1.4。
由于需要对未经验证的u人类进行过滤,经过查询django文档,发现提供了middelware(中间件)这个非常不错的方法,写下来和大家分享。
middleware即所谓的中间件,是django在request--->view接受请求 以及 view--->response返回结果之间的桥梁插件。其实和servlet中的filter有
几分相似。
django默认的配置文件中有以下几个:
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
这里middle执行的顺序和实际配置的顺序相关,
在request阶段:process_request,process_view 按照其所在类在配置中的先后顺序进行,
在response阶段:process_response,process_exception 则按照相反的顺序进行。
这里也可以发现AuthenticationMiddle是依赖SessionMiddle执行的
步入正题:
1) 如何写一个中间件呢
定义一个中间件类非常简单,就是普通的Python类,这里我就取名为LoginRequiredMiddleware
2) 需要实现接口或是需要哪些属性呢
这里中间件可以实现的方法有如下四个:
process_request -------- 接受request之后确定view之前执行
process_view 确定view之后 并且在view真正执行之前执行
process_response view执行之后
process_exception(self, request, exception) view抛出异常
根据本系统,只需要实现其中的progress_request方法即可,实现如下:
# MyLoginRequestMiddle.py
这里对代码稍作解释:
对url进行过滤的话,需要使用正则匹配,因此这里使用compile来生成正则对象
其次需要考虑剔除一些不需要过滤的url,例如登陆url,关于url,index或是default等,这里我将这写url都写到配置settigns中,
然后用list暂存正则对象,由于服务器启动时会自动加载middle,并且智慧加载一次,因此使用list不会占用多少内存。
然后我们在progress_request中编写我们的过滤函数,首先判断用户是否登陆
3) 如何使用呢
使用middleware非常简单,类似servlet中的filter,我们在settings配置文件中的MIDDLEWARE_CLASSES中加入我们的middle,如下所示:
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'tools.MyLoginRequiredMiddle.LoginRequiredMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
这样的话,没有登陆的用户将不能访问任何页面url(除了登陆页面)
大家有兴趣的话还可以进行延伸,比如说时权限url的控制(不同角色的用户有不同的功能界面,多个功能模块可能有所交叉),如何实现?
等待项目进度再和大家分享。
由于需要对未经验证的u人类进行过滤,经过查询django文档,发现提供了middelware(中间件)这个非常不错的方法,写下来和大家分享。
middleware即所谓的中间件,是django在request--->view接受请求 以及 view--->response返回结果之间的桥梁插件。其实和servlet中的filter有
几分相似。
django默认的配置文件中有以下几个:
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
这里middle执行的顺序和实际配置的顺序相关,
在request阶段:process_request,process_view 按照其所在类在配置中的先后顺序进行,
在response阶段:process_response,process_exception 则按照相反的顺序进行。
这里也可以发现AuthenticationMiddle是依赖SessionMiddle执行的
步入正题:
1) 如何写一个中间件呢
定义一个中间件类非常简单,就是普通的Python类,这里我就取名为LoginRequiredMiddleware
2) 需要实现接口或是需要哪些属性呢
这里中间件可以实现的方法有如下四个:
process_request -------- 接受request之后确定view之前执行
process_view 确定view之后 并且在view真正执行之前执行
process_response view执行之后
process_exception(self, request, exception) view抛出异常
根据本系统,只需要实现其中的progress_request方法即可,实现如下:
# MyLoginRequestMiddle.py
# -*- coding: utf-8 -*- from django.conf import settings from re import compile from django.http import HttpResponseRedirect EXEMPT_URLS=[compile(settings.LOGIN_URL.lstrip('/'))] if hasattr(settings,'LOGIN_EXEMPT_URLS'): EXEMPT_URLS += [compile(expr) for expr in settings.LOGIN_EXEMPT_URLS] class LoginRequiredMiddleware: def process_request(self, request): if 'user' not in request.session or not request.session['user']: path = request.path_info.lstrip('/') if not any(m.match(path) for m in EXEMPT_URLS): # print path return HttpResponseRedirect(settings.LOGIN_URL)
这里对代码稍作解释:
对url进行过滤的话,需要使用正则匹配,因此这里使用compile来生成正则对象
其次需要考虑剔除一些不需要过滤的url,例如登陆url,关于url,index或是default等,这里我将这写url都写到配置settigns中,
然后用list暂存正则对象,由于服务器启动时会自动加载middle,并且智慧加载一次,因此使用list不会占用多少内存。
然后我们在progress_request中编写我们的过滤函数,首先判断用户是否登陆
if 'user' not in request.session or not request.session['user']:此用户没有登陆,判断请求的路径是否合法:
path = request.path_info.lstrip('/') if not any(m.match(path) for m in EXEMPT_URLS):这里我们挨个匹配是否是被剔除的那写url,没有匹配到的话(非法),直接返回首页
return HttpResponseRedirect(settings.LOGIN_URL)如果匹配到了要剔除的url或是session存在的话,会继续执行后续的操作并进行返回
3) 如何使用呢
使用middleware非常简单,类似servlet中的filter,我们在settings配置文件中的MIDDLEWARE_CLASSES中加入我们的middle,如下所示:
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'tools.MyLoginRequiredMiddle.LoginRequiredMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
这样的话,没有登陆的用户将不能访问任何页面url(除了登陆页面)
大家有兴趣的话还可以进行延伸,比如说时权限url的控制(不同角色的用户有不同的功能界面,多个功能模块可能有所交叉),如何实现?
等待项目进度再和大家分享。
相关文章推荐
- 基于控制权限和登录验证跳转的django登录界面的实现
- Python+django实现邮箱验证登录
- django 中验证码登录验证的实现
- django学习——通过邮箱实现用户名的登录
- Python实现简单登录验证
- postgresql 登录使用GSS方式验证的实现原理分析
- django -- 登录验证
- 自定义拦截器实现验证登录
- 跨服务器登录验证(单点登录SSO)的过程和Java实现
- JQuery登录验证实现
- [Asp.Net MVC4]验证用户登录实现实例
- ASP.NET MVC3 实现用户登录验证
- Django实现表单登录
- django 快速实现完整登录系统(cookie)
- Spring mvc拦截器实现登录验证拦截
- SSH无密码验证登录的实现
- django实现登录和注册之HelloWorld
- 基于权限安全框架Shiro的登录验证功能实现
- SpringMVC+Spring+mybatis 实现登录过程(使用后台验证框架)
- Django实现表单验证