Django web后端开发:根据session实现网页账号登陆的注意事项

Django web开发:实现账号登录的注意事项以及2种根据session判断的方法
 
  最近学习基于Django的WEB后端开发,在做网站会员的登录判断时遇到了一些问题,为了提醒自己于是记录一下:
 
  我们做网站的会员登录时,一般都会采用session中间件的方式,使所有的网络请求都通过中间件,判断客户是否是已经登录的会员,如果不是则重定向到登录页面,这是框架要求的方法。
 
  但事实上我们可能会忽略这样一个问题,为了便于理解我们打一个比方:
如果一个景区要对所有来参观的游客售票,只有持票者方可进园参观,那么售票处应该设置在景区内还是景区外呢?
我们对于这个问题的答案都很清楚,但是在写登录页面时,却经常会做出“把售票处设在景区内”的做法,导致实际运行项目时,客户即使想要提交登录表单、退出登录、执行登陆操作甚至是调用生成验证码的网页,都会因为目前不处在登录状态被再次重定向到登录页去,非常不合理!
 
  解决这个矛盾,需要在园外就进行“检票”,具体实现有2种方法:
1.在判断session的中间件views文件里,将逻辑上无需判断登录状态的页面封装一个列表,在中间件判断时将其排除在外:
 # 判断管理后台是否登录
        #定义后台不登陆管理员也允许直接访问的路径列表
        urllist = ['/myadmin/login', '/myadmin/logout', '/myadmin/dologin', '/myadmin/verify']


        #判断当前url地址是否以后台(/myadmin)开头,并且不是管理员页面本身,即不在urllist中,才做登录判断
        if re.match(r'^/myadmin', path) and (path not in urllist):
            # 判断是否已经登陆了(session中没有adminuser),使用session
            if 'adminuser' not in request.session:
                # 重定向到登录页
                return redirect(reverse('myadmin_login'))

如上面说过的,逻辑上登录表单本身、登出表单、执行登录页面和登录时生成验证码的页面都是不需要判断登录状态的,因此用urllist封装,在中间件里判断一下即可!

2.在配置路由时就将需要判断和跳转到登录界面的url和无需判断的区分开,在判断session的中间件views文件里只需要使用正则表达式就可排除不需判断和跳转的:

urls.py:

 1 #前台大堂点餐子路由文件
 2 """
 3 from django.contrib import admin
 4 from django.urls import path, include
 5 from web.views import index
 6 
 7 urlpatterns = [
 8     path('', index.index, name="web_index"),
 9 
10     # 前台员工登录、退出路由,按照逻辑 ,这四个地址无需判断是否登录就可以访问
11     path('login', index.login, name="web_login"),  # 加载登陆表单
12     path('dologin', index.dologin, name="web_dologin"),  # 执行登录
13     path('logout', index.logout, name="web_logout"),  # 执行退出
14     path('verify', index.verify, name="web_verify"),  # 验证码,必须排除中间件,可以直接访问
15 
16     #为url路由添加请求前缀
17     #凡是带此前缀/web 的url均要登陆后才可访问
18     path("web/",include([
19         path('', index.webindex, name="web_index"), #前台大堂首页
20     ]))
21 ]

 

middleware.py:

1        #判断前台大堂点餐请求,判断是否有登录(session中是否有webuser)
2         if re.match(r'^/web', path) :
3             # 判断是否已经登陆了(session中没有webuser),使用session
4             if 'webuser' not in request.session:
5                 # 重定向到登录页
6                 return redirect(reverse('web_login'))

由于我们将需要判断的页面url中都带有了web/,因此直接正则判断即可。

 

以上方法均可实现正常登录页面不被影响,但是个人写模块是同模块url路径比较像,可能不会事先就因为session判断问题做区分,因此优先第一种。

完整代码与项目请参考课程:https://www.bilibili.com/video/BV1MK4y1n7TT?p=30&share_source=copy_web

posted @ 2022-09-07 13:43  丘丘王  阅读(96)  评论(0)    收藏  举报
鼠标点击页面特效

尝试在空白处点击鼠标