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中用fork()函数生成的子进程
May 04 Python
Python使用sorted排序的方法小结
Jul 28 Python
解决Pycharm界面的子窗口不见了的问题
Jan 17 Python
Python Selenium 之关闭窗口close与quit的方法
Feb 13 Python
python字符串和常用数据结构知识总结
May 21 Python
用Pytorch训练CNN(数据集MNIST,使用GPU的方法)
Aug 19 Python
python破解bilibili滑动验证码登录功能
Sep 11 Python
Pytorch自己加载单通道图片用作数据集训练的实例
Jan 18 Python
Python 实现网课实时监控自动签到、打卡功能
Mar 12 Python
python编写俄罗斯方块
Mar 13 Python
Python如何将将模块分割成多个文件
Aug 04 Python
python SOCKET编程基础入门
Feb 27 Python
python利用pandas分析学生期末成绩实例代码
使用pandas生成/读取csv文件的方法实例
python自动化八大定位元素讲解
python实现简单聊天功能
Python re.sub 反向引用的实现
Jul 07 #Python
Python制作一个随机抽奖小工具的实现
Python 数据科学 Matplotlib图库详解
You might like
mysql 性能的检查和优化方法
2009/06/21 PHP
php 图片加水印与上传图片加水印php类
2010/05/12 PHP
Linux下实现PHP多进程的方法分享
2012/08/16 PHP
基于php split()函数的用法详解
2013/06/05 PHP
PHP中的reflection反射机制测试例子
2014/08/05 PHP
浅析Yii2 GridView 日期格式化并实现日期可搜索教程
2016/04/22 PHP
PHP实现唤起微信支付功能
2019/02/18 PHP
TP5框架安全机制实例分析
2020/04/05 PHP
详解js中class的多种函数封装方法
2016/01/03 Javascript
jQuery获取select选中的option的value值实现方法
2016/08/29 Javascript
Javascript函数中的arguments.callee用法实例分析
2016/09/16 Javascript
详解AngularJS controller调用factory
2017/05/19 Javascript
浅谈vue中使用图片懒加载vue-lazyload插件详细指南
2017/10/23 Javascript
Angular2开发环境搭建教程之VS Code
2017/12/15 Javascript
js实现mp3录音通过websocket实时传送+简易波形图效果
2020/06/12 Javascript
js实现鼠标点击飘爱心效果
2020/08/19 Javascript
[02:28]PWL开团时刻DAY3——Ink Ice与DeMonsTer之间的勾心斗角
2020/11/03 DOTA
go和python调用其它程序并得到程序输出
2014/02/10 Python
python自动安装pip
2014/04/24 Python
python统计中文字符数量的两种方法
2019/01/31 Python
浅析Python 中的 WSGI 接口和 WSGI 服务的运行
2020/12/09 Python
Reformation官网:美国女装品牌
2018/09/14 全球购物
Gretna Green中文官网:苏格兰格林小镇
2019/10/16 全球购物
通信工程专业求职信
2014/06/04 职场文书
公民代理授权委托书
2014/09/24 职场文书
2014年人民调解工作总结
2014/12/08 职场文书
鼋头渚导游词
2015/02/05 职场文书
社区环境卫生倡议书
2015/04/29 职场文书
副校长2015年教育教学工作总结
2015/07/27 职场文书
婚宴来宾致辞
2015/07/28 职场文书
毕业班工作总结
2015/08/10 职场文书
如何使用Maxwell实时同步mysql数据
2021/04/08 MySQL
我对PyTorch dataloader里的shuffle=True的理解
2021/05/20 Python
redis缓存存储Session原理机制
2021/11/20 Redis
Redis中key的过期删除策略和内存淘汰机制
2022/04/12 Redis
JS轻量级函数式编程实现XDM三
2022/06/16 Javascript