Django——Auth模块
一、Auth 模块
Auth 用户认证,本质上也是设置 Session。
Django 认证系统同时处理认证和授权 认证:验证一个用户是否为 django 声明的用户,如果是可以进行登录 授权:决定一个已经验证的用户有哪些功能是允许操作。
在 django 迁移数据库的是时候会自动生成一个用户认证表:auth_user , 存放用户基本信息(用户名 , 密码,邮箱……)
扩建 auth_user 表中的字段数据 方法一:(不推荐) 创建一对一,绑定 auth_user 表 方法二:继承AbstractUser 在定义模型类的时候继承 AbstractUser , 进行数据库迁移不会生成 auth_user , 原有 auth_user 中的字段就继承到自定义的模型类中。 实现字段的扩建,直接在自定义模型类中添加额外新的字段即可。 扩建 auth_user 表的前提: 1、在实现扩建的时候,不允许,不能先执行迁移数据库(如果已经迁移过数据,那么就换一个新的数据库) 2、在扩建中,只能添加字段,不可以修改原有的字段。
重新配置 auth 认证模型类
# 配置自定义认证模型类 # AUTH_USER_MODEL = '应用名称.类名称' AUTH_USER_MODEL = 'AuthApp.User'
from django.shortcuts import render , HttpResponse , redirect from django.views import View from AuthApp.models import User from django.contrib.auth import authenticate , login def index(request): # request.user , 获取用户名 # AnonymousUser 匿名用户,表示用户名为登录 print(request.user) # 判断用户是否登录 print(request.user.is_authenticated) return render(request , 'index.html') class RegisterView(View): def get(self , request): return render(request , 'register.html') def post(self , request): name = request.POST.get('username') password = request.POST.get('password') email = request.POST.get('email') mobile = request.POST.get('mobile') ''' create:保存用户数据 ,密码不加密 create_user:密码加密 ''' User.objects.create_user(username=name , password=password , email=email , mobile=mobile) return redirect('/login/') class LoginView(View): def get(self , request): return render(request , 'login.html') def post(self , request): name = request.POST.get('username') password = request.POST.get('password') # authenticate 认证用户信息 , 用户存在返回用户数据 , 用户不存在返回 None user = authenticate(username=name , password=password) if not user: return render(request , 'login.html' , {'error_message':"用户名或者密码错误"}) # login 登录成功, 保存用户登录状态 login(request , user) return redirect('/index/')
实现验证登录,以及退出登录
# 配置全局的登录重定向 url LOGIN_URL = '/login/'
from django.contrib.auth.decorators import login_required ''' login_required 用户验证登录的装饰器 使用的时候需要配置局部的重定向 url @login_required(login_url='/login/') 配置项目全局的从定向 url , 到配置文件中添加 login_url 的信息 ''' @login_required def cart(request): return HttpResponse('<h1>购物车页面</h1>') # 注销用户信息之前必须保证用户是登录状态 @login_required def logoutview(request): # 注销用户(清除 Session 中的用户数据) logout(request) return redirect('/login/')
二、admin 站点
django 提供的网站后台数据管理
创建管理员用户
python manage.py createsuperuser
注册的时候,用户名不要中文,用户名和密码不要有一串一致的数据 ,邮箱允许为空 。
使用 admin 站点管理模型类数据
class Goods(models.Model): # verbose_name 对 admin站点中的模型类字段名称设置,对数据库不影响 name = models.CharField(max_length=50 , verbose_name='商品名称') price = models.DecimalField(max_digits=11 , decimal_places=3 , verbose_name='价格') stock = models.IntegerField(verbose_name='库存') sales = models.IntegerField(verbose_name='销量') class Meta: db_table = 'goods' #设置 admin 站点中的表名 verbose_name = '商品数据表' verbose_name_plural = verbose_name
注册模型类 ; 到所在应用下的 admin.py 文件中进行注册
from AdminApp.models import Goods admin.site.register(Goods)
修改 admin 站点中的应用名称
在所在应用中的__init__.py
添加
default_app_config = 'AdminApp.apps.AdminappConfig'
在对应的应用中的 apps.py 维纳设置站点使用的应用名称
在 apps.py 的类中添加属性
verbose_name = '商品表'
admin 模型类数据操作 , 在 admin.py 文件中操作
@admin.register(Goods) class GoodsAdmin(admin.ModelAdmin): # list_display 在站点中显示指定字段数据信息 list_display = ['id' , 'name' , 'price' , 'sales'] # list_filter 选择指定的字段作为条件过滤 list_filter = ['name' , 'sales'] # list_per_page 设置分页 , 指定每一页有多少条数据 list_per_page = 2 # search_fields 配置搜索条件,数据类型要用元组 search_fields = ('id' , 'name') # list_editable 在显示列表页中设置允许修改的字段数据 list_editable = ('name' , 'price') # # fields 在编辑页中指定字段允许修改 # fields = ('name' , 'price') # fieldsets 设置编辑页分组显示数据 fieldsets = ( # ('分组名称' , {'fields':[指定字段名]} ('商品基本信息' , {'fields':['name' , 'price']}), ('商品销量信息' , {'fields':['sales' , 'stock']}) ) # 设置只读字段 readonly_fields = ('name',)
在 admin 站点中可以自定义字段数据 , 不影响数据库
def num(g): # 参数 g , 下面的类会自动的将模型类传入 add = g.price * g.sales return add # 制作 num 在 admin 站点中的字段名 num.short_description = '商品销售额' @admin.register(Goods) class GoodsAdmin(admin.ModelAdmin): # list_display 在站点中显示指定字段数据信息 list_display = ['id' , 'name' , 'price' , 'sales' , num]
遭周文而舒志
链接:https://pan.baidu.com/s/1ir9eM2kL2D7hU9ZTNu4-Xw
提取码:malw