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 相关文章推荐
简单的编程0基础下Python入门指引
Apr 01 Python
Python的Django框架中的表单处理示例
Jul 17 Python
Python中字符串格式化str.format的详细介绍
Feb 17 Python
Python对文件和目录进行操作的方法(file对象/os/os.path/shutil 模块)
May 08 Python
python中实现指定时间调用函数示例代码
Sep 08 Python
python pandas dataframe 行列选择,切片操作方法
Apr 10 Python
使用python读取csv文件快速插入数据库的实例
Jun 21 Python
python数据结构之线性表的顺序存储结构
Sep 28 Python
Python django使用多进程连接mysql错误的解决方法
Oct 08 Python
Python模块、包(Package)概念与用法分析
May 31 Python
WxPython实现无边框界面
Nov 18 Python
Python中Matplotlib的点、线形状、颜色以及绘制散点图
Apr 07 Python
python利用pandas分析学生期末成绩实例代码
使用pandas生成/读取csv文件的方法实例
python自动化八大定位元素讲解
python实现简单聊天功能
Python re.sub 反向引用的实现
Jul 07 #Python
Python制作一个随机抽奖小工具的实现
Python 数据科学 Matplotlib图库详解
You might like
使用PHPCMS搭建wap手机网站
2015/09/20 PHP
解决thinkphp5未定义变量会抛出异常,页面错误,请稍后再试的问题
2019/10/16 PHP
PHP7 list() 函数修改
2021/03/09 PHP
js客户端快捷键管理类的较完整实现和应用
2010/06/08 Javascript
基于jQuery的星级评分插件
2011/08/12 Javascript
javascript 进阶篇3 Ajax 、JSON、 Prototype介绍
2012/03/14 Javascript
Javascript this 的一些学习总结
2012/08/02 Javascript
Three.js源码阅读笔记(Object3D类)
2012/12/27 Javascript
js获得鼠标的坐标值的方法
2013/03/13 Javascript
使用PHP+JQuery+Ajax分页的实现
2013/04/23 Javascript
PhotoShop给图片自动添加边框及EXIF信息的JS脚本
2015/02/15 Javascript
JavaScript数组的一些奇葩行为
2016/01/25 Javascript
Angular2  NgModule 模块详解
2016/10/19 Javascript
24个解决实际问题的ES6代码片段(小结)
2020/02/02 Javascript
Vue移动端用淘宝弹性布局lib-flexible插件做适配的方法
2020/05/26 Javascript
JavaScript仿京东轮播图效果
2021/02/25 Javascript
python调用fortran模块
2016/04/08 Python
python3 与python2 异常处理的区别与联系
2016/06/19 Python
浅析python打包工具distutils、setuptools
2018/04/20 Python
Python之list对应元素求和的方法
2018/06/28 Python
numpy 计算两个数组重复程度的方法
2018/11/07 Python
Window环境下Scrapy开发环境搭建
2018/11/18 Python
python实现最小二乘法线性拟合
2019/07/19 Python
python bluetooth蓝牙信息获取蓝牙设备类型的方法
2019/11/29 Python
Python调用SMTP服务自动发送Email的实现步骤
2021/02/07 Python
英国羊绒服装购物网站:Pure Collection
2018/10/22 全球购物
英国排名第一的停车场运营商:NCP
2019/08/26 全球购物
澳大利亚在线奢侈品时尚零售平台:Azura Runway
2021/01/13 全球购物
PHP数据运算类型都有哪些
2013/11/05 面试题
德语专业求职信
2014/03/12 职场文书
《春雨》教学反思
2014/04/24 职场文书
企业财务经理岗位职责
2015/04/08 职场文书
2015年化验员工作总结
2015/04/10 职场文书
红色电影观后感
2015/06/18 职场文书
中学图书馆工作总结
2015/08/11 职场文书
windows server2008 开启端口的实现方法
2022/06/25 Servers