专栏首页开发 & 算法杂谈django 实现未经登录验证的url过滤

django 实现未经登录验证的url过滤

本人在做一个基于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     

# -*- 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的控制(不同角色的用户有不同的功能界面,多个功能模块可能有所交叉),如何实现?

等待项目进度再和大家分享。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Redis源码阅读之rdb.c

    REDIS_RDB_ENC_LZF |compressed_len | original_len | compressed_string

    chain
  • 较快速在一个数组中查找最大值和最小值(2)

    chain
  • JNI基础知识学习汇总

    JNI(Java Native Interface),也就是java本地接口,主要是用来支持和本地代码之间的互动-在Java程序中调用native code或者...

    chain
  • 30.Django CSRF 中间件

    CSRF 1.概述   CSRF(Cross Site Request Forgery)跨站点伪造请求,举例来讲,某个恶意的网站上有一个指向你的网站的链接,如...

    zhang_derek
  • Django框架的安装,项目创建

    郭楷丰
  • 1000个常用的Python库和示例代码

    下面是programcreek通过分析大量开源代码,提取出的最常用的python库。

    用户4962466
  • Django学习_简易博客(一)

    zx钟
  • 调用链系列三:解读UAVStack中的调用链技术

    在Java中,HTTP协议的请求/响应模型是由Servlet规范+Servlet容器(如Tomcat)实现的。换句话说,在类Tomcat容器中,一次完整的HTT...

    宜信技术学院
  • Django-2.0.3快速安装方法

    版权声明:本文为耕耘实录原创文章,各大自媒体平台同步更新。欢迎转载,转载请注明出处,谢谢

    耕耘实录
  • Django环境搭建

    在学习python语言的过程中,不得不学习django,理由很简单的,就是django有一个很优秀的框架,特别是它提供了一个admin的后台,这样在不浪费什么精...

    无涯WuYa

扫码关注云+社区

领取腾讯云代金券