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:三种方式都可以 """ # @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 print(user_obj) # jerry 登录成功之后的用户对象 print(user_obj.username) # 拿到对象的具体内容 print(user_obj.password) # 拿到对象的具体内容 '''注意事项:传递参数的时候,用户名和密码必须同事传入 要么全部使用Auth模块的方法,要么全部自己写,不能混合使用 ''' if auth.ogj: auth.login(request, user_obj) # 保存用户信息相当于request.session['username'] = user_obj.usernane '''写了auth.login,就可以在全局任何有request对象的地方通过request.user拿到用户的对象 return redirect('/page/') # auth自带的认证登录装饰器 # @login_required # 默认跳转http://127.0.0.1:8000/accounts/login/?next=/order/ @login_required(login_url='/order/login/') # 局部设置,指定跳转 def order(request): # 验证用户是否登录 print(request.user.is_authenticated) # True/False return HttpResponse('reder') ###################配置文件中全局配置 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='[email protected]')
扩展默认的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. 扩展之前别迁移. """
标签:username,Python,request,auth,day64,csrf,password,user From: https://www.cnblogs.com/zfq132/p/17628819.html