ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

py csrf装饰器与中间件以及auth模块的深入学习

2022-05-25 21:00:22  阅读:151  来源: 互联网

标签:中间件 py request 用户 auth user csrf password


今日学习内容

  • csrf相关装饰器

  • 基于中间件思想编写项目

    将功能封装成配置的形式 实现可插拔式设计  # 非常重要
    
  • auth认证模块

  • bbs项目分析

csrf相关装饰器

# 导入模块
from django.views.decorators.csrf import csrf_exempt,csrf_protect
"""
两个方法的作用:
csrf_exempt 
    忽略csrf校验
csrf_protect
    开启csrf校验
"""
# 针对FBV
@csrf_exempt
def login(request):
    return render(request, 'login.html')
直接加装饰器 发送请求就会忽略校验

@csrf_protect
def login(request):
    return render(request, 'login.html')
仅对当前视图开启校验
# 针对CBV
csrf_protect 三种CBV添加装饰器的方式都可以

csrf_exempt  只有一种方式可以生效(给重写的dispatch方法装)
class MyView(views.View):
    @method_decorator(csrf_exempt)
    def dispatch(self, request, *args, **kwargs):
        return super(MyView, self).dispatch(request, *args, **kwargs)


    def post(self, request):
        return HttpResponse('from MyView post')

基于中间件思想编写项目

# importlib模块补充
  importlib模块作为Python内置模块,提供了更多导入模块的方式
  通过字符串的形式导入模块
常用方法:
	importlib.import_module(str): 根据字符串导入1个模块 该字符串以.为路径分割 如'django.middleware.security.SecurityMiddleware'
# 常规导入方式
# 字符串导入方式
import importlib
module_path = 'ccc.b'  # 一个模块所对应的路径以字符串的形式
res = importlib.import_module((module_path))
print(res)  # 相当于模块的名字
print(res.name)  # 模块中的数据
# 导入最小层级是.py文件

功能的插拔式设计

'''以发送提示信息为需求 编写功能'''
方式1:封装成函数
方式2:封装成配置
import settings
import importlib
def send_all(msg):
    # 1.循环获取配置文件中字符串信息
    for str_path in settings.NOTIFY_FUNC_LIST:  # 'notify.email.Email'
        # 2.切割路径信息
        module_path, class_str_name = str_path.rsplit('.', maxsplit=1)  # ['notify.email','Email']
        # 3.根据module_path导入模块文件
        module = importlib.import_module(module_path)
        # 4.利用反射获取模块文件中对应的类名
        class_name = getattr(module, class_str_name)  # Email  Msg  QQ
        # 5.实例化
        obj = class_name()
        # 6.调用发送消息的功能
        obj.send(msg)

auth认证模块

# 简介
  在开发一个网站的时候,无可避免的需要设计实现网站的用户系统 
  此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能 功能多事有点麻烦
  Django作为一个终极框架 当然也会想到这些情况 它内置了强大的用户认证系统--auth 它默认提供auth_user表来存储用户数据
    
# django提供给你快速完成用户相关功能的模块
  用户相关功能:创建、认证、编辑...
# django也配套提供了一张'用户表'
  执行数据库迁移命令之后默认产生的auth_user
# django自带的admin后台管理用户登录参考的就是auth_user表
  创建admin后台管理员用户:run manage.py task>>:createsuperuser
  自动对用户密码进行加密处理并保存

auth模块方法大全

# 1.验证用户名和密码是否正确
  auth.authenticate()
  提供了用户认证功能 即验证用户名以及密码是否正确 一般需要username 、password两个关键字参数
  如果认证成功(用户名和密码正确有效)便会返回一个 User对象
  authenticate()会在该User对象上设置一个属性来标识后端已经认证了该用户 且该信息在后续的登录过程中是需要的

# 得到一个用户对象 里面有该用户在用户表auth_user中存放的所有信息
user_obj = auth.authenticate(request, username=username, password=password)

# 获取当前用户对象
  request.user
# 2.保存用户登录状态
  auth.login()
  该函数接受一个HttpRequest对象,以及一个经过认证的User对象
  该函数实现一个用户登录的功能 它本质上会在后端为该用户生成相关session数据 响应数据时会在中间件中操作session表 保存该用户信息 并在浏览器中保存cookie

def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        user_obj = auth.authenticate(request, username=username, password=password)
        if user_obj:
        	# 保存用户状态
        	auth.login(request, user_obj)
# 3.注销登录
  auth.logout(request)
  该函数接受一个HttpRequest对象,无返回值
  当调用该函数时 当前请求的session信息会全部清除 该用户即使没有登录 使用该函数也不会报错
   
  def logout(request):
    auth.logout(request)  # 类似于调用了 request.session.flush()
    return redirect('/app01/index/')
# 4.判断当前用户是否登录
  request.user.is_authenticated()
  用来判断当前请求是否通过了认证

  如果用户已经登录 会返回True  
  def my_view(request):
  if not request.user.is_authenticated():
  	return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
  如果没登陆 打印request.user看到的是匿名用户
print(request.user)  # AnonymousUser
# 5.确认密码是否正确
  check_password(password)
  auth 提供的一个检查密码是否正确的方法,需要提供当前请求用户的密码 密码正确返回True 否则返回False

  is_right = request.user.check_password(old_pwd)
# 6.修改密码
  set_password(password)    
  auth提供的一个修改密码的方法 接收要设置的新密码 作为参数
  ps:设置完一定要调用用户对象的save方法
  
  request.user.set_password()
  request.user.save()
# 7.校验登录装饰器
  auth给我们提供的一个装饰器工具 用来快捷的给某个视图添加登录校验
  from django.contrib.auth.decorators import login_required
  @login_required(login_url='/login/')  # 局部配置
  @login_required  # 全局配置
  LOGIN_URL = '/login/'  # 需要在配置文件中添加配置
    
@login_required  # 需要全局配置登录路由地址 LOGIN_URL = '/login/'
def logout(request):
    auth.logout(request)
    return redirect('/index.html/')
# 8.创建新用户
  auth提供的一个创建新用户的方法 需要提供必要参数(username、password)等
ps: 创建用户就要使用到auth_user表 需要导入User
  from django.contrib.auth.models import User
  from django.contrib.auth.models import User
user = User.objects.create_user(username='用户名',password='密码',email='邮箱',...)
# 创建新的超级用户
  auth提供的一个创建新的超级用户的方法 需要提供必要参数(username、password)等
  from django.contrib.auth.models import User
user = User.objects.create_superuser(username='用户名',password='密码',email='邮箱',...)

auth扩展表字段

# 方式1:编写一对一表关系(了解)
# 方式2:类继承(推荐)
我们可以通过继承内置的AbstractUser类 来定义一个自己的Model类

from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
    """
    用户信息表
    """
    user_id = models.AutoField(primary_key=True)
    phone = models.CharField(max_length=11, null=True, unique=True)
    def __str__(self):
        return self.username
   
# 引用Django自带的User表 继承使用时需要设置
AUTH_USER_MODEL = 'app01.Users'

"""
1.类继承之后 需要重新执行数据库迁移命令 并且库里面是第一次操作才可以
2.auth模块所有的方法都可以直接在自定义模型类上面使用
	自动切换参照表
ps:一旦我们指定了新的认证系统所使用的表 我们就需要重新在数据库中创建该表 而不能继续使用原来默认的auth_user表了
"""

标签:中间件,py,request,用户,auth,user,csrf,password
来源: https://www.cnblogs.com/kazz/p/16310850.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有