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实现的批量下载RFC文档
Mar 10 Python
Python实现简单截取中文字符串的方法
Jun 15 Python
Python决策树和随机森林算法实例详解
Jan 30 Python
详解python3中tkinter知识点
Jun 21 Python
Django代码性能优化与Pycharm Profile使用详解
Aug 26 Python
Linux下Pycharm、Anaconda环境配置及使用踩坑
Dec 19 Python
python 实现分页显示从es中获取的数据方法
Dec 26 Python
在linux下实现 python 监控usb设备信号
Jul 03 Python
Django rstful登陆认证并检查session是否过期代码实例
Aug 13 Python
pip install python 快速安装模块的教程图解
Oct 08 Python
python修改文件内容的3种方法详解
Nov 15 Python
推荐8款常用的Python GUI图形界面开发框架
Feb 23 Python
python利用pandas分析学生期末成绩实例代码
使用pandas生成/读取csv文件的方法实例
python自动化八大定位元素讲解
python实现简单聊天功能
Python re.sub 反向引用的实现
Jul 07 #Python
Python制作一个随机抽奖小工具的实现
Python 数据科学 Matplotlib图库详解
You might like
用PHP读取flv文件的播放时间长度
2009/09/03 PHP
php expects parameter 1 to be resource, array given 错误
2011/03/23 PHP
thinkPHP5使用Rabc实现权限管理
2019/08/28 PHP
javascript GUID生成器实现代码
2009/10/31 Javascript
事件冒泡是什么如何用jquery阻止事件冒泡
2013/03/20 Javascript
js监控IE火狐浏览器关闭、刷新、回退、前进事件
2014/07/23 Javascript
一道JS前端闭包面试题解析
2015/12/25 Javascript
JavaScript实现点击按钮直接打印
2016/01/06 Javascript
jQuery使用contains过滤器实现精确匹配方法详解
2016/02/25 Javascript
JavaScript中localStorage对象存储方式实例分析
2017/01/12 Javascript
基于JQuery的购物车添加删除以及结算功能示例
2017/03/08 Javascript
Django使用多数据库的方法
2017/09/06 Javascript
vue router学习之动态路由和嵌套路由详解
2017/09/21 Javascript
vue组件发布到npm简单步骤
2017/11/30 Javascript
适用于 Vue 的播放器组件Vue-Video-Player操作
2020/11/16 Javascript
python数据结构之二叉树的遍历实例
2014/04/29 Python
使用Python编写一个模仿CPU工作的程序
2015/04/16 Python
详解Python下载图片并保存本地的两种方式
2019/05/15 Python
Python 列表去重去除空字符的例子
2019/07/20 Python
python多继承(钻石继承)问题和解决方法简单示例
2019/10/21 Python
Python 去除字符串中指定字符串
2020/03/05 Python
Python自动化操作实现图例绘制
2020/07/09 Python
Python学习之time模块的基本使用
2021/01/17 Python
快速创建 HTML5 Canvas 电信网络拓扑图的示例代码
2018/03/21 HTML / CSS
英国最大的纸工艺品商店:CraftStash
2018/12/01 全球购物
Dyson戴森波兰官网:Dyson.pl
2019/08/05 全球购物
几个SQL的面试题
2014/03/08 面试题
什么是事务?为什么需要事务?
2012/01/09 面试题
幼儿园教师奖惩制度
2014/02/01 职场文书
社会学专业学生职业规划书
2014/02/07 职场文书
教师节促销方案
2014/03/22 职场文书
纪检干部先进事迹材料
2014/08/23 职场文书
签订劳动合同通知书
2015/04/16 职场文书
大学生支教感言
2015/08/01 职场文书
fastdfs+nginx集群搭建的实现
2021/03/31 Servers
css3 利用transform-origin 实现圆点分布在大圆上布局及旋转特效
2021/04/29 HTML / CSS