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


Posted in Python onJuly 09, 2021
目录
  • 1.urls.py
  • 2.login/models.py
  • 3.views.login和login.html
  • 4.views.index
  • 4.views.index
  • 5.views.logout
  • 6.总结session和forms的搭配

当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),
]

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

策略:

  • 未登录人员,不论是访问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_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

<!doctype html>
<html lang="en">
  <head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <!-- 上述meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
    <!-- Bootstrap CSS -->
    <link href="https://cdn.bootcss.com/twitter-bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet">
    <title>登录</title>
  </head>
  <body>
    <div class="container">
            <div class="col">
                <form class="form-login" action="/login/" method="post">
                  {% if message %}
                    <div class="alert alert-warning">{{ message }}</div>
                  {% endif %}
                  {% csrf_token %}
                  <h3 class="text-center">欢迎登录</h3>

                  {{ login_form }}

                  <div>
                      <a href="/register/" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="text-success " ><ins>新用户注册</ins></a>
                      <button type="submit" class="btn btn-primary float-right">登录</button>
                  </div>
                </form>
            </div>
    </div> <!-- /container -->

    <!-- Optional JavaScript -->
    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    {#    以下三者的引用顺序是固定的#}
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
    <script src="https://cdn.bootcss.com/popper.js/1.15.0/umd/popper.js"></script>
    <script src="https://cdn.bootcss.com/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script>

  </body>
</html>

这里重要的地方是这个语句——{{ 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如下:

<!DOCTYPE html>
    <!-- Optional JavaScript -->
    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    {#    以下三者的引用顺序是固定的#}
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
    <script src="https://cdn.bootcss.com/popper.js/1.15.0/umd/popper.js"></script>
    <script src="https://cdn.bootcss.com/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script>
​
  </body>
</html>

这里重要的地方是这个语句——{{ 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如下:

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h1>{{ request.session.user_name }}!  欢迎回来!</h1>
<p>
    <a href="/logout/">登出</a>
</p>
</body>
</html>

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

最后,再来看看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权限管理内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
浅谈Python 中整型对象的存储问题
May 16 Python
Python中使用asyncio 封装文件读写
Sep 11 Python
python实现随机调用一个浏览器打开网页
Apr 21 Python
python使用多进程的实例详解
Sep 19 Python
Python-copy()与deepcopy()区别详解
Jul 12 Python
Pyinstaller 打包exe教程及问题解决
Aug 16 Python
利用Python复制文件的9种方法总结
Sep 02 Python
python3实现用turtle模块画一棵随机樱花树
Nov 21 Python
python 实现批量替换文本中的某部分内容
Dec 13 Python
python可视化text()函数使用详解
Feb 11 Python
解决python中显示图片的plt.imshow plt.show()内存泄漏问题
Apr 24 Python
Python pytesseract验证码识别库用法解析
Jun 29 Python
python利用pandas分析学生期末成绩实例代码
使用pandas生成/读取csv文件的方法实例
python自动化八大定位元素讲解
python实现简单聊天功能
Python re.sub 反向引用的实现
Jul 07 #Python
Python制作一个随机抽奖小工具的实现
Python 数据科学 Matplotlib图库详解
You might like
PHP中数组合并的两种方法及区别介绍
2012/09/14 PHP
php去除字符串换行符示例分享
2014/02/13 PHP
PHP字符串比较函数strcmp()和strcasecmp()使用总结
2014/11/19 PHP
Grid得到选择行数据的方法总结
2011/01/17 Javascript
jquery键盘事件介绍
2011/01/31 Javascript
简单实用jquery版三级联动select示例
2013/07/04 Javascript
JS交换变量的方法
2015/01/21 Javascript
JS实现网页顶部向下滑出的全国城市切换导航效果
2015/08/22 Javascript
原生js实现移动端瀑布流式代码示例
2015/12/18 Javascript
Uploadify上传文件方法
2016/03/16 Javascript
详解JS几种变量交换方式以及性能分析对比
2016/11/25 Javascript
vue实现随机验证码功能的实例代码
2019/04/30 Javascript
JavaScript箭头函数中的this详解
2019/06/19 Javascript
新手快速入门JavaScript装饰者模式与AOP
2019/06/24 Javascript
基于JavaScript或jQuery实现网站夜间/高亮模式
2020/05/30 jQuery
[05:11]TI9战队采访——VIRTUSPRO
2019/08/22 DOTA
django中的setting最佳配置小结
2017/11/21 Python
python编写暴力破解zip文档程序的实例讲解
2018/04/24 Python
python 请求服务器的实现代码(http请求和https请求)
2018/05/25 Python
python requests post多层字典的方法
2018/12/27 Python
python 基于TCP协议的套接字编程详解
2019/06/29 Python
Python叠加两幅栅格图像的实现方法
2019/07/05 Python
python使用百度文字识别功能方法详解
2019/07/23 Python
Python完全识别验证码自动登录实例详解
2019/11/24 Python
基于python requests selenium爬取excel vba过程解析
2020/08/12 Python
python安装sklearn模块的方法详解
2020/11/28 Python
英国男女豪华配饰和礼品网站:Black.co.uk
2020/02/28 全球购物
语文教育专业应届生求职信
2013/11/23 职场文书
yy结婚证婚词
2014/01/10 职场文书
《小猫刮胡子》教学反思
2014/02/21 职场文书
2014年党的群众路线教育实践活动总结
2014/04/25 职场文书
自强之星事迹材料
2014/05/12 职场文书
企业年检委托书范本
2014/10/14 职场文书
婚礼领导致辞大全
2015/07/28 职场文书
MySQL基础(二)
2021/04/05 MySQL
Python实现生活常识解答机器人
2021/06/28 Python