其他分享
首页 > 其他分享> > 今日学习内容总结5.9

今日学习内容总结5.9

作者:互联网

今日学习内容总结

csrf相关装饰器

两种装饰器

    1.  @csrf_exempt: 全局启用csrf校验的时候,使用过该装饰器可以使得局部不进行校验

    2. @csrf_protect:全局禁用csrf校验的时候,使用该装饰器可以使得局部任然进行校验

两种装饰器的使用

      先导入装饰器:

from django.views.decorators.csrf import csrf_exempt,csrf_protect

      为cbv添加装饰器

# @csrf_exempt  # 全局启用,csrf_CBV可以不进行校验
@csrf_protect  # 全局禁用(也就是注释掉CSRF校验的中间件),csrf_CBV仍然进行校验
def csrf_CBV(request):
    if request.method == 'GET':
        return render(request,'csrf_CBV.html')
    elif request.method == "POST":
        from_name = request.POST.get('from_name')
        to_name = request.POST.get('to_name')
        money = request.POST.get('money')
        return HttpResponse(f'{from_name}向{to_name}转账{money}元成功')

      针对fbv添加装饰器

@csrf_protect\@csrf_exempt
def login(request):
    return render(request,'login.html')

基于中间件思想编写项目

      我们之前说过,每个中间件其实就是一个类。而基于中间件思想编写项目,其实就是可以通过字符串的形式导入模块。

# 常规导入方式
    from ccc import b
    print(b)  # <module 'ccc.b' from '/Users/jiboyuan/PycharmProjects/day61_1/ccc/b.py'>
    print(b.name)

# 字符串导入方式
    import importlib
    module_path = 'ccc.b'
    res = importlib.import_module(module_path)
    print(res.name)

# 发送提示信息功能示例
方式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)

Django值auth模块

前言

      我们在开发一个网页的时候, 无可避免的需要设计实现网站的用户系统; 此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能, 为了节省这个麻烦的过程, Django自带了强大的用户认证系统Auth, 它默认使用auth_user表来存储用户的数据。

auth模块的使用

      先导入auth模块

form django.contrib import auth 

      进行数据迁移命令来生成auth_user表

python3 manage.py makemigrations
python3 manage.py migrate

      auth_user表字段

      字段介绍

字段 释义
id ID
password 密码
last_login 最后登录时间
is_superuser 是否是管理员
username 用户名
first_name
last_name
email 邮箱
is_staff 是否是工作人员
is_active 是否激活
date_joined 创建时间

常用方法

      authenticated : 登入认证

    1. 作用:提供了用户认证功能,即验证用户名以及密码是否正确

    2. 必须传入两个参数 : username & password

    3. 校验成功返回 True, 校验失败返回 None

    4. request 可以不用传, 默认就是 None
from django.contrib import auth

user_obj = auth.authenticated(request, username=username, password=password)
if user_obj:
    print(user_obj.username)
    print(user_obj.password)
else:
    print('校验失败')

      login : 保存用户状态

    1. 作用 : 该函数接收一个HttpRequest对象,以及一个经过认证的 User 对象

    2. 实现一个用户登录的功能, 本质上会在后端为该用户生成相关session数据存在session表中

    3. 只要执行了该方法 你就可以在任何地方通过request.user获取到当前登陆的用户对象,否则拿到的是一个匿名用户对象
# 登入成功后调用
auth.login(request, user_obj)   # 内部调用的就是 request.session['key']=user_obj

      request.user : 获取当前用户对象

      auth组件的中间间中做了这样一个事情,当request请求来时,判断是否有session,如果有session则会根据session去django_session中找出相应的用户的信息,并赋值给request.user属性,也就是request.user=user是一个User数据对象,否则返回一个匿名的对象给request.user,该对象调用所有的方法都返回None

def index(request):
    print(request.user)
# 是一个懒加载数据对象

      is_authenticated : 判断用户是否登入

      用来判断当前请求是否通过了认证

# 视图类中使用
if not request.user.is_authenticated():
    print('未登入,请先登入')

# 模板中使用
{% if request.user.is_authenticated %}
    {{ request.user.username }} 欢迎回家
{% else %}
    <a href="/auth_login/">请去登录</a>
{% endif %}

      login_required : 登入认证装饰器

      作用 : 一个装饰器工具, 用来快捷的给某个视图添加登录校验

# 使用方式一 : 直接在视图函数上添加
@login_required(login_url='/login/')  # 需要指定url(因为它存在默认url)
@login_required  # 全局配置
def logout_func(request):
    auth.logout(request)
    return redirect("/login/")
    
# 使用方式二 : 在配置文件中全局配置
LOGIN_URL = '/login/'

      check_password : 检验密码

    1. 作用 : 提供的一个检查密码是否正确的方法, 需要提供当前请求用户的密码

    2. 密码正确返回 True, 否则返回 False
if user.check_password('[你的密码]'):
    print('ok')

      set_password : 修改密码

    1.作用 : 提供的一个修改密码的方法, 接收要设置的新密码作为参数

    2. 设置完一定要调用用户对象的 save 方法

      logout : 退出登入

    1. 作用 : 该函数接受一个HttpRequest对象,无返回值

    2. 当调用该函数时, 当前请求的session信息会全部清除; 该用户即使没有登录, 使用该函数也不会报错
# 注销当前登录用户:
auth.logout(request)  # 内部使用的就是 request.session.flush()

      create_user : 创建普通用户

      作用 : 提供的一个创建新用户的方法, 需要提供必要参数 username & password等

from django.contrib.auth.models import User

user = User.objects.create_user(username='用户名',password='密码',email='邮箱',...)

      create_superuser : 创建管理员用户

      作用 : 提供的一个创建管理员用户的方法, 需要提供必要参数 username & password & email等

from django.contrib.auth.models import User
user = User.objects.create_superuser(username='用户名',password='密码',email='邮箱',...)

auth扩展表字段

      auth_user 中的字段有限, 想要在 auth_user 表中添加新的字段, 我们可以对其进行扩展。

扩展方式一 : 建立一对一外键关系

      新建一个模型类, 比如要添加 Phone 字段, 在该模型内中写入, 并添加 User 的外键字段

from django.contrib.auth.models import User 
class user_detail(models.Model):
    user=models.OneToOneField(to='User')
    phone=models.CharField(max_length=32)

扩展方式二 : 继承 AbstractUser 类来扩写 (步骤)

    1. 首先大前提是没有生成 auth_user 表(也就是没进行数据库迁移操作)(有的话需要删干净迁移记录和表)

    2. 书写一个类, 并继承 AbstractUser 类

    3. 在类中可以书写你需要扩展的字段, 也可以重写原来的字段
        class MyAuthUser(AbstractUser):
            username=models.CharField(max_length=12)  # 重写字段
            phone=models.CharField(max_length=32)     # 书写新字段

    4. 到 setting.py 配置文件中设置 AUTH_USER_MODEL 参数, 不然报错
        AUTH_USER_MODEL = "[app名].[类名]"
        AUTH_USER_MODEL = "app01.MyAuthUser"  # 示例

    5. 最后进行数据库迁移命令
        python3 manage.py makemigrations
        python3 manage.py migrate

如果 auth_user 表已经存在

    1. 先删库

    2. 并清空项目中所有的 makemigrations 而来的迁移记录

    3. 再清空源码中admin,auth俩app的 makemigrations 产生的记录

标签:总结,name,5.9,request,auth,学习,user,csrf,import
来源: https://www.cnblogs.com/blank1210/p/16310482.html