慕课网-Django入门到进阶-更适合Python小白的系统课程-第7章Django中的用户权限的基本使用-7-5权限验证与cookiesesion(1)

第7章 Django 中的用户权限的基本使用

7-5 权限验证与 cookiesesion(1)

权限 permission

1.权限是指为了保证职责的有效履行,任职者必须具备的,对某事项进行决策的范围和程度

2.权限与用户是一种多对多的关系

定义权限

class A(models.Model):
    title = models.CharField(max_length=10)

    def __str__(self):
        return '{}'.format(self.title)

    class Meta:
        permissions = [
            ('look_page', 'can get this page message')
        ]

用户权限管理

from django.contrib.auth.models import User, Permission

# 获取用户对象和需要的权限对象
user = User.objects.get(pk=1)
permission = Permission.objects.filter(codename='look_page').first()

# 判断用户是否拥有某权限
if not user.has_perm('app.look_page'):
    user.user_permissions.add(permission) # 给用户添加某权限
user.user_permissions.remove(permission) # 用户去掉某权限
user.user_permissions.values() # 查看用户当前用户的权限
dir(user.user_permissions) # 查看更多关于用户可操作权限的方法
    

用户与组与权限

from django.contrib.auth.models import User, Permission, Group

permission = Permission.objects.filter(codename='look_page').first()
group = Group.objects.create(name='pages') # 创建组
group.permissions.add(permission) # 组添加权限
group.permissions.values() # 查看组中权限
group.permissions.remove(permission) # 删除组
user.groups.add(group) # 用户添加组

Cookies

1.指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据

2.我们的 http 协议是一种无状态的连接,当请求结束后,下一次再请求,服务并不知道是否和上一次的请求是同一台机器或人,所以为了保证确认每次请求的都是谁,就通过 cookie 进行在浏览器端的保存,每次请求,服务端通过获取浏览器上的 cookie 确认来访者是谁

3.cookie 的存储方式是类似字典的方式,以 key:value 的形式存储,不同的服务会存储在浏览器端不同的域名下  

Session

使用情景与 cookie 相同,但不同的是,Session 的值存在服务器端,而通过在浏览器端存储一个 cookie(cookie 中存储一个能对应服务器端 Session 的 value)而达到获取制定 Session 值的目的

实例

1.在项目 user 下 目录 app,修改文件 models.py

# coding:utf-8

from django.db import models

class Apage(models.Model):
    title = models.CharField(max_length=10)

    def __str__(self):
        return '{}'.format(self.title)

    class Meta:
        permissions = [
            ('look_a_page', 'can get this a page message')
        ]

class Bpage(models.Model):
    title = models.CharField(max_length=10)

    def __str__(self):
        return '{}'.format(self.title)

    class Meta:
        permissions = [
            ('look_b_page', 'can get this b page message')
        ]

2.在项目 user 下命令行窗口创建数据表

python manage.py makemigrations
python manage.py migrate

3.在命令行窗口进入 mysql 界面

use django_user;
show tables;

4.在项目 user 下目录 templates,新建文件 a.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>a page</title>
</head>
<body>
欢迎访问
</body>
</html>

5.在项目 user 下目录 templates,新建文件 b.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>b.page</title>
</head>
<body>
欢迎访问 b
</body>
</html>

6.在项目 user 下目录 app,修改文件 views.py,添加类 A 和 类 B

#coding:utf-8

from django.contrib.auth.models import User
from django.contrib.auth.hashers import make_password
from django.contrib.auth import login, logout, authenticate
from django.shortcuts import render, redirect, reverse
from django.views import View

class Regist(View):
    TEMPLATE = 'regist.html'

    def get(self, request):
        if request.user.is_authenticated:
            return redirect(reverse('login'))
        error = request.GET.get('error', '')
        return render(request, self.TEMPLATE, {'error':error})

    def post(self, request):
        username = request.POST.get('username')
        password = request.POST.get('password')
        check_password = request.POST.get('check_password')
        if password != check_password:
            return redirect('/regist?error=密码不相同')

        exists = User.objects.filter(username=username).exists()
        if exists:
            return redirect('/regist?error=该用户已存在')
        user = User.objects.create_user(
            username=username,
            password=password
        )
        user.save()
        return redirect(reverse('login'))

class Login(View):
    TEMPLATE = 'login.html'
    
    def get(self, request):
        error = request.GET.get('error', '')
        return render(request, self.TEMPLATE, {'error':error})

    def post(self, request):
        username = request.POST.get("username")
        password = request.POST.get("password")

        exists = User.objects.filter(username=username).exists()
        if not exists:
            return redirect('login/?error=没有该用户')

        user = authenticate(username=username, password=password)
        if user:
            login(request, user)
        else:
            return redirect('/login?error=密码错误')
        return redirect('/login')

class LogoutUser(View):
    def get(self, request):
        logout(request)
        return redirect(reverse('login'))

class A(View):
    TEMPLATE = 'a.html'

    def get(self, request):
        return render(request, self.TEMPLATE)

class B(View):
    TEMPLATE = 'b.html'

    def get(self, request):
        return render(request, self.TEMPLATE)

7.在项目 user 下目录 app,修改文件 urls.py  

#!/usr/bin/env python
# -*- coding:utf-8 -*-

from django.urls import path
from .views import Regist, Login, LogoutUser, A, B

urlpatterns = [
    path('regist', Regist.as_view(), name='regist'),
    path('login', Login.as_view(), name='login'),
    path('logout', LogoutUser.as_view(), name='logout'),
    path('a', A.as_view(), name='a_page'),
    path('b', B.as_view(), name='b_page'),
]

8.在项目 user 下命令行窗口开启服务

python manage.py runserver

9.测试

 

10.在项目 user 下目录 app,修改文件 views.py,在类 A 添加权限

#coding:utf-8

from django.contrib.auth.models import User, Permission
from django.contrib.auth.hashers import make_password
from django.contrib.auth import login, logout, authenticate
from django.shortcuts import render, redirect, reverse
from django.views import View

class Regist(View):
    TEMPLATE = 'regist.html'

    def get(self, request):
        if request.user.is_authenticated:
            return redirect(reverse('login'))
        error = request.GET.get('error', '')
        return render(request, self.TEMPLATE, {'error':error})

    def post(self, request):
        username = request.POST.get('username')
        password = request.POST.get('password')
        check_password = request.POST.get('check_password')
        if password != check_password:
            return redirect('/regist?error=密码不相同')

        exists = User.objects.filter(username=username).exists()
        if exists:
            return redirect('/regist?error=该用户已存在')
        user = User.objects.create_user(
            username=username,
            password=password
        )
        user.save()
        return redirect(reverse('login'))

class Login(View):
    TEMPLATE = 'login.html'
    
    def get(self, request):
        error = request.GET.get('error', '')
        return render(request, self.TEMPLATE, {'error':error})

    def post(self, request):
        username = request.POST.get("username")
        password = request.POST.get("password")

        exists = User.objects.filter(username=username).exists()
        if not exists:
            return redirect('login/?error=没有该用户')

        user = authenticate(username=username, password=password)
        if user:
            login(request, user)
        else:
            return redirect('/login?error=密码错误')
        return redirect('/login')

class LogoutUser(View):
    def get(self, request):
        logout(request)
        return redirect(reverse('login'))

class A(View):
    TEMPLATE = 'a.html'

    def get(self, request):
        if not request.user.is_authenticated:
            return redirect('/login')
        
        a_permission = Permission.objects.get(codename='look_a_page')
        if not request.user.has_perm(a_permission):
            return render(request, self.TEMPLATE, {'error': '您无权访问该页'})
        
        return render(request, self.TEMPLATE)

class B(View):
    TEMPLATE = 'b.html'
    
    def get(self, request):
        return render(request, self.TEMPLATE)

11.在项目 user 下目录 templates,修改文件 a.html  

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>a page</title>
</head>
<body>
{{error}}
</body>
</html>

  

posted on 2020-02-13 09:58  herisson_pan  阅读(10)  评论(0)    收藏  举报

导航