慕课网-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) 收藏 举报
浙公网安备 33010602011771号