django|django 如何编写控制登录和访问权限控制的中间件
django中,很多时候我们都需要有一个地方来进行更加详细的权限控制,例如说哪些用户可以访问哪些页面,检查登录状态等,这里的话就涉及到了中间件的编写了。
在django项目下的setting.py文件中,有一个MIDDLEWARE_CLASSES的字段,这里存放的就是中间件,用户的访问会先经过这些中间件的处理之后再给各种views函数进行处理。在这个参数中加入我们接下来要编写的中间件:
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
#'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
'myTransport.views.ExteriorAuthMiddleware',
)
接下来实现:
【django|django 如何编写控制登录和访问权限控制的中间件】
classExteriorAuthMiddleware(object):
#判断登录 权限控制
def process_request(self,request):
if request.method == 'GET':
requestData = https://www.it610.com/article/request.GET
else:
requestData = request.POST
request.session['errmsg']=''
#如果用户没有认证,需要转到登录界面
if not request.session.has_key('_auth_user_id') and 'login' not in request.path:
return HttpResponseRedirect('/login/')
#如果用户已经登录
elif request.session.has_key('_auth_user_id') and 'logout' not in request.path:
###权限检验
try:
u=User.objects.get(username=request.user)
#判断token是否过期
if u.usertoken_set.all():
if u.usertoken_set.all()[0].token != request.session['Token']:
logger.error("token 不一致!")
return HttpResponseRedirect('/login/')
else:
logger.error("获取不到token!")
return HttpResponseRedirect('/login/')url=request.META['PATH_INFO']
print request.get_full_path()
#判断用户是否有某些页面的访问权限,如果没有,转到404页面
if not u.is_superuser:
if url.startswith('/transport/user_') or url.startswith('/log/'):
return error403(request, "权限不够!")
except Exception,e:
logger.error("in function process_request :"+ str(e))
return HttpResponseRedirect('/login/')
#用户已登录,而且url是login,将转到首页
if request.session.has_key('_auth_user_id') and 'login' in request.path:
return HttpResponseRedirect('/index/')
以上只是个简单的示例
推荐阅读
- 考研英语阅读终极解决方案——阅读理解如何巧拿高分
- 如何寻找情感问答App的分析切入点
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus使用queryWrapper如何实现复杂查询
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- django-前后端交互
- 如何在Mac中的文件选择框中打开系统隐藏文件夹
- 漫画初学者如何学习漫画背景的透视画法(这篇教程请收藏好了!)
- java中如何实现重建二叉树
- Linux下面如何查看tomcat已经使用多少线程