今日学习内容总结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 | 名 |
邮箱 | |
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