第7次课中展示了在Admin后台管理系统中创建超级用户、普通用户及权限管理的操作,本次课展示如果在代码中实现同样的功能。
本节的知识点将会在项目的用户注册与登录环节使用。
9.1 准备环境
1、新建项目chapter09
2、新建应用authapp
3、应用authapp下创建模型Book
from django.db import models
class Book(models.Model):
name = models.CharField(max_length=100, verbose_name='书名')
price = models.FloatField(verbose_name='价格')
4、注册模型到后台,authapp应用下admin.py
from django.contrib import admin
from authapp.models import Book
@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('name', 'price')
5、生成并执行迁移,创建数据库表
python manage.py makemigrations
python manage.py migrate
9.2 用户权限管理
User类提供了创建普通用户的方法create_user()
和创建超级用户的方法create_superuser()
。
python manage.py shell
创建超级用户
from django.contrib.auth.models import User,Permission,Group
admin = User.objects.create_superuser('admin','admin@qq.com','admin')
admin.save()
创建普通用户
from django.contrib.auth.models import User
sd = User.objects.create_user('sd','sd@qq.com','sd')
sd.save()
默认情况下,通过User类创建的用户默认保存在数据表auth_user中。
修改密码
from django.contrib.auth.models import User
u=User.objects.get(username='admin')
u.set_password('admin')
u.save()
让用户可以登录到后台管理系统
User.objects.filter(username='sd').update(is_staff=True)
从表中取到用户
admin = User.objects.get(username = 'admin')
sd = User.objects.get(username='sd')
权限管理
from django.contrib.auth.models import User,Permission
#分配权限
sd.user_permissions.add(Permission.objects.get(codename = 'add_user'))
sd.user_permissions.add(Permission.objects.get(codename = 'change_user'))
sd.user_permissions.add(Permission.objects.get(codename = 'delete_user'))
sd.user_permissions.add(Permission.objects.get(codename = 'add_book'))
sd.user_permissions.add(Permission.objects.get(codename = 'change_book'))
#一次性增加多个权限
sd.user_permissions.add(Permission.objects.get(codename='add_book'),Permission.objects.get(codename='change_book'),Permission.objects.get(codename='delete_book'))
#通过列表,一次性增加多个权限
sd.user_permissions.set([Permission.objects.get(codename='add_book'),Permission.objects.get(codename='change_book'),Permission.objects.get(codename='delete_book'),Permission.objects.get(codename='view_book')])
#删除权限
sd.user_permissions.remove(Permission.objects.get(codename='add_book'))
sd.user_permissions.remove(Permission.objects.get(codename='change_book'))
#一次性移除多个权限
sd.user_permissions.remove(Permission.objects.get(codename='add_book'),Permission.objects.get(codename='change_book'),Permission.objects.get(codename='delete_book'))
查看用户的全部权限
#此时查到的权限为创建sd对象那一刻,sd对象所拥有的权限;如果通过sd对象更新了权限,想查看更新后的权限,需要重新获取到这个对象
sd.get_user_permissions()
sd.get_all_permissions()
#或者直接这样使用
User.objects.get(username='admin').get_user_permissions()
User.objects.get(username='sd').get_all_permissions()
查看用户的某个权限
has_perm('应用名.权限名_模型名')
super_user = User.objects.get(username='admin')
super_user.has_perm('auth.add_user')
super_user.has_perm('Good.add_Good')
9.3 组权限管理
#创建分组
group = Group.objects.create(name='python')
group.save()
#分配权限,一次性分配多个权限
group.permissions.add(Permission.objects.get(codename='add_book'),Permission.objects.get(codename='delete_book'),Permission.objects.get(codename='change_book'),Permission.objects.get(codename='view_book'))
#清空权限
group.permissions.clear()
#分配权限,一次性分配多个权限,set()
group.permissions.set([Permission.objects.get(codename='add_book'),Permission.objects.get(codename='delete_book'),Permission.objects.get(codename='change_book'),Permission.objects.get(codename='view_book')])
#移除权限,一次性移除多个权限
group.permissions.remove(Permission.objects.get(codename='add_book'),Permission.objects.get(codename='delete_book'))
#用户加入组
sd.groups.add(group)
#分别查看sd权限,可看出两个函数的区别
sd.get_user_permissions()
sd.get_all_permissions()
#用户退出指定组
sd.groups.remove(group)
#用户退出所有组
sd.groups.clear()
9.4 用户登录与退出
authapp/views.py
# 用户登录
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.decorators import login_required
from django.shortcuts import render, redirect
from django.urls import reverse
from django.views import View
class LoginView(View):
'''登录类视图'''
def get(self, request):
return render(request, "login.html")
def post(self, request):
"""Post方式,用户名登录"""
username = request.POST['username'] # 用户名
password = request.POST['password'] # 密码
user = authenticate(username=username, password=password)
if user is not None:
login(request, user) # 用户登录
return redirect(reverse('auth_app:index'))
else:
return render(request, 'login.html', {'account_errmsg': '用户名或密码错误'})
class LogoutView(View):
"""退出登录"""
def get(self, request):
logout(request)
# 重定向到登录页面
return redirect(reverse('auth_app:login'))
# 首页相关视图函数
class IndexView(View):
'''进入首页'''
def get(self, request):
return render(request, 'index.html')
'''用于保护某个视图函数(函数视图或类视图)只能被已登录的用户访问。
当用户尝试访问该视图函数时,如果用户未登录,
则会被重定向到登录页面,要求其先进行登录操作。'''
@login_required()
def user_center(request):
return render(request, 'userinfo.html')
在templates文件夹下边新建login.html
<body>
<div style="width:400px;vertical-align:middle;margin: 0 auto;">
<form method="post" >
{% csrf_token %}
<td><label>用户名</label></td>
<td><input type="text" name="username" placeholder="请输入用户名"></td>
<br>
<td><label>密码</label></td>
<td><input type="password" name="password" placeholder="请输入密码"></td>
<div style="color:red">{{ account_errmsg }}</div>
<input type="submit" name="登录" style="height: 30px">
</form>
</div>
</body>
templates文件夹下新建index.html
<body>
<div class="index">
{% if user.is_authenticated %}
欢迎您:{{ user.username }}
<br>
<a href="{% url 'auth_app:logout' %}">退出</a>
<span>|</span>
<a href="{% url 'auth_app:info' %}">用户中心</a>
{% else %}
<a href="{% url 'auth_app:login' %}">登录</a>
{% endif %}
</div>
</body>
templates文件夹下新建userinfo.html
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户中心</title>
</head>
<body>
<p>用户中心页面</p>
<a href="{% url 'auth_app:logout' %}">退出登录</a>
</body>
</html>
配置根路由和子路由
根路由urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('authapp.urls', namespace='auth_app')),
]
在auth_app应用下新建urls.py文件,子路由auth_app/urls.py代码如下:
from django.urls import path, include
from auth_app import views
app_name = 'auth_app'
urlpatterns = [
path('login/', views.LoginView.as_view(), name='login'),
path('info/', views.user_center, name='info'),
path('index/', views.IndexView.as_view(), name='index'),
path('logout/', views.LogoutView.as_view(), name='logout')
]
访问服务器,python manage.py runserver
登录,在浏览器中输入 http://127.0.0.1:8000/login/
显示登录成功的首页信息,点击用户中心,进入用户中心界面。
9.5 Cookie
9.5.1 Cookie是什么
Cookie是访问某个网站时保存在用户本地的一小段文本信息。
Cookie的用途有:
-
记录用户登录状态,方便用户在下次访问时不必再次输入用户名和密码。
-
记录用户偏好设置,如语言和字体大小等。
-
跟踪用户行为以用于广告和分析:通过分析cookie中的数据,网站可以更好地了解用户的兴趣和行为,以便提供更好的服务。
-
用于购物车:通过管理Cookie,网站可以在用户离开网站时保存他们购物车中的商品列表,便于用户下次继续购买。
-
提供个性化内容:通过利用Cookie中的信息,网站可以为每个用户提供相关的个性化内容。
9.5.2 用法
1、创建cookie_app应用,并把应用名添加到setting.py的INASTALLED_APP中。
2、配置路由
并分别在根urls.py和cookie_app/urls.py文件中配置URL。
根urls.py
path('cookie_app/', include('cookie_app.urls')),
cookie_app/urls.py
from django.urls import path, include
from cookie_app import views
urlpatterns = [
path('set_cookie/', views.set_cookie),
path('show_cookie/', views.show_cookie),
path('delete_cookie/',views.delete_cookie)
]
cookie_app/views.py
from django.http import HttpResponse
def set_cookie(request):
"""设置cookie"""
response = HttpResponse('设置cookie')
response.set_cookie('python', 'chapter08', max_age=600)
return response
def show_cookie(request):
cookie = request.COOKIES.get('python')
return HttpResponse(f'cookie的值是:{cookie}')
def delete_cookie(request):
response = HttpResponse('删除cookie')
response.delete_cookie('python')
return response
在浏览器地址栏中输入“http://127.0.0.1:8000/cookie_app/set_cookie/”,此时Cookie已经设置完成,点击浏览器中的“查看网站信息”图标可以打开正在使用的Cookie信息,查看已设置的Cookie。
最后,在浏览器地址栏中输入“http://127.0.0.1:8000/cookie_app/show_cookie/”,此时页面响应Cookie的值。
最后,在浏览器地址栏中输入“http://127.0.0.1:8000/cookie_app/delete_cookie/”,此时通过查看网站信息查看Cookie是否删除。
9.6 Session
9.6.1 Session是什么
Session是一种存储在服务器端的用于记录用户信息的机制。
HTTP是一种无状态协议,每个请求都是独立的,服务器不知道两个请求是否来自同一个客户端。为了解决这个问题,Session被引入。Session可以存储在服务器端的内存、硬盘、数据库等不同的位置,用户在访问网站时,服务器会为每个访问用户创建一个Session ID,用于标识该用户的Session对象,Session ID会被存储在客户端的Cookie中,并在每个HTTP请求中传递回服务器。
Session的主要用途是记录用户信息,例如用户的登录信息、购物车内容、浏览历史、个人设置等。通过session,程序可以识别不同的用户,并为每个用户提供个性化的服务。Session还可以用于跨页面传递数据,例如将用户输入数据传递到下一个页面。Session也可以用于实现网站的安全机制,例如记录用户最后一次操作时间,强制用户在一定时间内重新登录,防止非法访问。
9.6.2 Session的用法
1、创建session_app应用,并把应用名添加到setting.py的INASTALLED_APP中。
2、创建视图
session_app/views.py
from django.http import HttpResponse
# Create your views here.
def set_session(request):
"""设置session的name和value,和"""
request.session['python'] = 'chapter08'
request.session.set_expiry(10) # 设置过期时间,秒
return HttpResponse('写入session')
# 获取session
def get_session(request):
value = request.session.get('python')
return HttpResponse(f"Python对应的 value值为:{value}")
根路由
path('session_app/', include('session_app.urls'))
session_app/urls.py
from django.urls import path
from session_app import views
urlpatterns = [
path('set_session/', views.set_session),
path('get_session/', views.get_session),
]
python manage.py runserver
在浏览器地址栏中输入http://127.0.0.1:8000/session_app/set_session/并按下回车键,此时Session已写入完成。可在数据库中查询到
在浏览器地址中输入“http://127.0.0.1:8000/session_app/get_session/”,可看到Session中key值为“Python”所对应的value值。