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

目录

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的时候,都是真正的登陆用户.

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容