• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Django中session进行权限管理的使用

python 搞代码 4年前 (2022-01-07) 21次浏览 已收录 0个评论
文章目录[隐藏]

本文主要介绍了Django中session进行权限管理的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

当session启用后,传递给视图request参数的HttpRequest对象将包含一个session属性,就像一个字典对象一样。你可以在Django的任何地方读写request.session属性,或者多次编辑使用它。

这个文件在我的C:\Users\17764530215\test\mysite地址

1.urls.py

 from django.contrib import admin from django.urls import path from login import views urlpatterns = [ path('admin/', admin.site.urls), path('index/', views.index), path('login/', views.login), path('register/', views.register), path('logout/', views.logout), ] 

策略:

  • 未登录人员,不论是访问index还是login和logout,全部跳转到login界面
  • 已登录人员,访问login会自动跳转到index页面
  • 已登录人员,不允许直接访问register页面,需先logout
  • 登出后,自动跳转到login界面

(wow,这其实就是我们的功能!!)

2.login/models.py

 from django.db import models # Create your models here. class User(models.Model): gender = ( ('male', "男"), ('female', "女"), ) name = models.CharField(max_length=128, unique=True) password = models.CharField(max_length=256) email = models.EmailField(unique=True) sex = models.CharField(max_length=32, choices=gender, default="男") c_time = models.DateTimeField(auto_now_add=True) def __str__(self): return self.name class Meta: ordering = ["-c_time"] verbose_name = "用户" verbose_name_plural = "用户" 

各字段含义:

name: 必填,最长不超过128个字符,并且唯一,也就是不能有相同姓名; password: 必填,最长不超过256个字符(实际可能不需要这么长); email: 使用Django内置的邮箱类型,并且唯一; sex: 性别,使用了一个choice,只能选择男或者女,默认为男; 使用__str__方法帮助人性化显示对象信息; 元数据里定义用户按创建时间的反序排列,也就是最近的最先显示;

3.views.login和login.html

views.login:

 def login(request): if request.session.get('is_login', None):  # 不允许重复登录 return redirect('/index/') if request.method == 'POST': login_form = forms.UserForm(request.POST)   #上一次填写了这个表单,所以从这里得到这个表单的数据 message = '请检查填写的内容!' if login_form.is_valid(): username = login_form.cleaned_data.get('username') password = login_form.cleaned_data.get('password') try: user = models.User.objects.get(name=username) except : message = '用户不存在!' return render(request, 'login/login.html', locals()) if user.password == password:   #如果用户名和密码都成功 # 往session字典内写入用户状态和数据: request.session['is_login'] = True  #is<strong style="color:transparent">来源gaodai#ma#com搞@代~码网</strong>_login=True表示成功登陆 request.session['user_id'] = user.id request.session['user_name'] = user.name return redirect('/index/')  #重定向到主页 else: message = '密码不正确!' return render(request, 'login/login.html', locals()) else: return render(request, 'login/login.html', locals()) # 不是POST的话,统统转去login.html login_form = forms.UserForm() return render(request, 'login/login.html', locals())

我们进入login时,会去session里面找is_login项,如果为true就表示已经登陆了,所以就重定向到/index/中,进入首页.

如果为False,即没有登陆,那么往下走。如果是POST方法,那么执行一系列操作,如果不是POST,就表示是第一次用GET的方式登陆到这个login网页的,那么就用forms.UserForm产生一个对象login_form,将其作为参数传到login/login.html模板文件中,待会再介绍这个文件。

如果为False,且是POST时,就表明是填写了表单的,这里就涉及很多业务逻辑和session的管理了,重点讲。如果login_form.is_valid() 如下:通过login_form = forms.UserForm(request.POST)得到填写的这个表单数据,然后去和数据库的用户名密码去验证,如果通过了,那么就将request.session[‘is_login’]改为True,表示在登陆状态,并且把user_id和user_name字段也改成对应的数据,这个之后应该有用.

下面进入login/login.html

   <!-- Required meta tags --><!-- 上述meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! --><!-- Bootstrap CSS --><title>登录</title> <div class="container"> <div class="col">  {% if message %} <div class="alert alert-warning">{{ message }}</div> {% endif %} {% csrf_token %} <h3 class="text-center">欢迎登录</h3> {{ login_form }} <div> <ins>新用户注册</ins><button type="submit" class="btn btn-primary float-right">登录</button></div></div></div><!-- /container --><!-- Optional JavaScript --><!-- jQuery first, then Popper.js, then Bootstrap JS --> {#    以下三者的引用顺序是固定的#} 

这里重要的地方是这个语句――{{ login_form }},在这个位置插入了一个表单login_form,然后填写好这个表单以后,用view里面的login函数通过执行login_form = forms.UserForm(request.POST)来获取填写的这个表单数据,然后去进行校验等等操作…

有了这两个,我们的权限管理就基本完成了!本质上,这俩东西提供了一种机制――――可以对输入的用户数据存在session里,然后校验的时候从session中取出,去判断是否是合法的用户。那么,我们只需要再修改一下index.html,也是用session去校验,这样,直接通过网址访问的用户,由于没有session,就会被拦截!

4.views.index

 def index(request): if not request.session.get('is_login', None):   #如果不在登陆状态,就重定向到login return redirect('/login/') return render(request, 'login/index.html')  #如果在登陆状态,就进入index.html的模板文件 

这里逻辑很清楚:如果不在登陆状态,就重定向到login;如果在登陆状态,就直接重定向到真正的login/index.html模板。在这么模板中,我们就可以开发各种功能了,该demo中的login/index/html如下:

 <!-- Optional JavaScript --><!-- jQuery first, then Popper.js, then Bootstrap JS --> {#    以下三者的引用顺序是固定的#}  ​ 

这里重要的地方是这个语句――{{ login_form }},在这个位置插入了一个表单login_form,然后填写好这个表单以后,用view里面的login函数通过执行login_form = forms.UserForm(request.POST)来获取填写的这个表单数据,然后去进行校验等等操作…​有了这两个,我们的权限管理就基本完成了!本质上,这俩东西提供了一种机制――――可以对输入的用户数据存在session里,然后校验的时候从session中取出,去判断是否是合法的用户。那么,我们只需要再修改一下index.html,也是用session去校验,这样,直接通过网址访问的用户,由于没有session,就会被拦截!​

4.views.index

 def index(request): if not request.session.get('is_login', None):   #如果不在登陆状态,就重定向到login return redirect('/login/') return render(request, 'login/index.html')  #如果在登陆状态,就进入index.html的模板文件 

这里逻辑很清楚:如果不在登陆状态,就重定向到login;如果在登陆状态,就直接重定向到真正的login/index.html模板。在这么模板中,我们就可以开发各种功能了,该demo中的login/index/html如下:

   <title>首页</title> <h1>{{ request.session.user_name }}!  欢迎回来!</h1><p> 登出</p>

最后,再来看看logout的实现吧

5.views.logout

 def logout(request):    #登出 if not request.session.get('is_login', None):   #如果不在登陆状态,就直接转发到登陆界面 # 如果本来就未登录,也就没有登出一说 return redirect("/login/") request.session.flush() #清空session # 或者使用下面的方法 # del request.session['is_login'] # del request.session['user_id'] # del request.session['user_name'] return redirect("/login/")  #重定向到login界面 

如果未登陆,那么直接重定向/login/界面,如果是登陆状态,那么需要先通过 request.session.flush()来清空session,然后再重定向到/login/的登陆界面.

6.总结session和forms的搭配

forms其实是在html中,通过将表单和对象联系在一起,就可以很容易在填写表单后,通过forms去找到填写的内容。
session其实是权限校验的利器!没有session的时候,用户可以直接访问index界面,有session的时候,index函数的处理逻辑就变成通过session去判断是否登陆。当然,与之配套,还必须要用login,logout等函数来维护好这个session信息,保证一个不变性――所有session中的is_login字段为True的时候,都是真正的登陆用户.

到此这篇关于Django中session进行权限管理的使用的文章就介绍到这了,更多相关Django session权限管理内容请搜索gaodaima搞代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持gaodaima搞代码网

以上就是Django中session进行权限管理的使用的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Django中session进行权限管理的使用

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址