- csrf跨站请求的相关装饰器 - Auth模块的使用 - 凡是跟登录、注册、修改密码、注销登录、验证是否登录等的功能都可以使用Auth模块实现 - 扩展auth_user表 - BBS项目的需求分析

发布时间 2023-08-13 13:06:29作者: Py玩家

csrf跨站请求的相关装饰器

 Django中有一个中间件对csrf跨站做了验证,我只要把csrf的这个中间件打开,意味着所有的方法都要被验证

在所有的视图函数中:
  只有几个视图函数做验证
  只有几个函数不做验证

csrf_protect: 哪个视图函数加了这个装饰器,这个函数就会做验证
 csrf_exempt:哪个视图函数加了这个装饰器,这个函数就不会做验证

from django.views.decorators.csrf import csrf_exempt,csrf_protect
# @csrf_protect
@csrf_exempt
def index(request):
    return render(request, 'index.html')

# @csrf_protect
def func(request):
    return render(request, 'func.html')

 

CBV针对于csrf_exempt:只有第三张方式才生效,其余两种方式不行
CBV针对于csrf_protect:三种方式都可以

from django.views.decorators.csrf import csrf_exempt,csrf_protect
# @method_decorator(csrf_exempt,name='post') # 第二种方式也不行
# @method_decorator(csrf_protect,name='post') # 第二种方式也行
class Login(View):
    # @method_decorator(csrf_exempt)  # 第三张方式可以
    @method_decorator(csrf_protect)  # 第三张方式可以
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request, *args, **kwargs)
    # 不让post方法做验证
    # @method_decorator(csrf_exempt)  # 第一种方式不行
    # @method_decorator(csrf_protect)  # 第一种方式行
    def post(self, request):
        print("post")
        return HttpResponse("post")

Auth模块的使用

Auth模块是什么

Auth模块是Django自带的用户认证模块:

我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统。此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能,这还真是个麻烦的事情呢。

Django作为一个完美主义者的终极框架,当然也会想到用户的这些痛点。它内置了强大的用户认证系统–auth,它默认使用 auth_user 表来存储用户数据。

 在执行数据库迁移命令的时候,会自动生成一个默认的表,其中有auth_开头的很多表
 auth_user表的作用:djagno自带的后台管理系统所依赖的数据就在这张表中
默认情况下,auth_user表是空表,没有用户名和密码,因此我们需要自己创建用户数据
需要创建一个超级管理员账号才能登录:python38 manage.py createsuperuser

Auth模块的相关方法

登录功能、注册功能、修改密码、退出系统、认证功能等学习如何使用

登录功能

user_obj = auth.authenticate(request, username=username, password=password)
print(user_obj) # None

auth.login(request, user_obj) # request.session['username'] = user_obj.usernane

装饰器

@login_required(login_url='/order/login/')  # 局部设置跳转路径
def order(request):
    pass

LOGIN_URL = '/login/' # 全局配置

Auth模块之退出系统

def logout(request):
    # 清除cookie或者session
    auth.logout(request)
    return redirect('/home/')

 

Auth模块之修改密码功能

is_right = request.user.check_password(old_password)

# 修改密码
request.user.set_password(new_password) # 这种写法没有真正的操作数据库
request.user.save()

Auth模块之注册功能

from django.contrib.auth.models import User
# 入库
# User.objects.create(username=username, password=password)
# User.objects.create_user(username=username, password=password)
User.objects.create_superuser(username=username, password=password,email='123@qq.com')

扩展默认的auth_user表

# 默认情况下使用的就是auth_user的默认字段
# 扩展我们自己的字段

# 前提是:所有的模型类都继承
from django.contrib.auth.models import AbstractUser

# 不要继承了models.Model
扩展之后需要在配置文件中加一句话

"""""在扩展表之前数据库不能够迁移,扩展这个表需要在迁移数据库之前做"""""
# 如果你迁移了,还想扩展怎么办?
1. 换库
2. 需要删除很多个应用的migrations文件夹

python manage.py migrate myapp --fake

"""
扩展表之后发生的变化:
1. 原来的auth_user表不存在了,换成你自己新建的表名了
2. 原来的auth_user表中的字段还都在,然后多了自己扩展的字段
3. 继承的类要发生改变AbstractUser
4. 在配置文件中加入下面一句话:
AUTH_USER_MODEL = 'app01.UserInfo'
AUTH_USER_MODEL = '应用名.类名'
5. 扩展之后还是按照原来的auth_user表使用
6. auth模块中的数据还是你扩展的表
7. 扩展之前别迁移.