今日学习目标

  • 逐步掌握csrf相关装饰器、基于中间件思想编写项目、auth认证模块知识点

文章目录

  • 今日学习目标
  • 学习内容
  • 一、 csrf相关装饰器
  • 二、基于中间件思想编写项目
  • 三、auth认证模块
    • Auth模块是什么
    • auth模块方法大全

学习内容

  • csrf相关装饰器

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

  • auth认证模块


一、 csrf相关装饰器

在平时场景中,并不一定所有的接口验证都需要进行csrf验证,我们采用的是在settings.py中间件配置进行全局配置,如果遇到不需要验证的,我们可以采用局部禁用。

FBV

from django.views.decorators.csrf import csrf_exempt,csrf_protect@csrf_protect      #局部使用
def index(request):.....
@csrf_exempt       #局部禁用
def login(request):.....

CBV

from django.views.decorators.csrf import csrf_exempt, csrf_protect
from django.utils.decorators import method_decorator
from django.shortcuts import render, HttpResponse
from django.views import Viewclass Cs(View):#@method_decorator(csrf_exempt)@method_decorator(csrf_protect)def dispatch(self, request, *args, **kwargs):return super().dispatch(request, *args, **kwargs)def get(self, request, *args, **kwargs):return HttpResponse('GET,响应内容')def post(self, request, *args, **kwargs):return HttpResponse('Post,响应内容')

Django加装饰器

from django.views.decorators.csrf import csrf_exempt, csrf_protect
from django.utils.decorators import method_decorator
# 1.方法
@csrf_protect
def get(request):pass# 2.类上
@method_decorator(wraper,name="dispatch")
class Foo(View):# @method_decorator(csrf_exempt)# @method_decorator(csrf_protect)def dispatch(self, request, *args, **kwargs):return super().dispatch(request, *args, **kwargs)def get(self,request):passdef post(self,request):pass

注意:csrf必须加在dispatch上

二、基于中间件思想编写项目

importlib模块
可以通过字符串的形式导入模块

常规导入方式

from ccc import bprint(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)

基于中间件思想编写项目示例

from ccc.b import name  # 可以直接导变量数据
import importlib
module_path = 'ccc.b.name'
importlib.import_module(module_path)  # 不可以 最小导入单位是模块文件级别'''以发送提示信息为需求 编写功能'''
方式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认证模块

Auth模块是什么

Auth模块是Django自带的用户认证模块:
在开发网站的时候,无可避免的需要设计实现网站的用户系统。此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码、校验、验证用户是否登录等功能。

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

auth模块方法大全

from django.contrib import auth

authenticate()方法

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

user = authenticate(username='usernamer', password='password')"""
1.自动查找auth_user表
2.自动给密码加密再比对注意事项:括号里面必须同时传入用户名和密码
"""

login(HttpRequest, user)

该函数接受一个HttpRequest对象,以及一个经过认证的User对象。
该函数实现一个用户登录的功能。它本质上会在后端为该用户生成相关session数据。

用法
只要执行了login(request, user)方法,就可以在任意地方通过request.user获得当前登录的用户对象。

from django.contrib.auth import authenticate, logindef login(request):username = request.POST['username']password = request.POST['password']user = authenticate(username=username, password=password)if user is not None:login(request, user)# Redirect to a success page....else:# Return an 'invalid login' error message....

is_authenticated()

用来判断当前请求是否通过了认证。可以用来判断用户是否登陆过。

def home(request):if not request.user.is_authenticated():return redirect(...)

login_requierd() 装饰器

auth 给我们提供的一个装饰器工具,用来快捷的给某个视图添加登录校验。

from django.contrib.auth.decorators import login_required@login_required(login_url='/login/')  # 局部配置
def my_view(request):

若用户没有登录,则会跳转到django默认的 登录URL '/accounts/login/ ’ 并传递当前访问url的绝对路径 (登陆成功后,会重定向到该路径)。

如果需要自定义登录的URL,除了局部配置,也可以在settings.py文件中通过LOGIN_URL进行修改。

LOGIN_URL = '/login/'  # 这里配置成你项目登录页面的路由

check_password(password)

auth 提供的一个检查密码是否正确的方法,需要提供当前请求用户的密码。
密码正确返回True,否则返回False。

ok = user.check_password('密码')

set_password(password)

auth 提供的一个修改密码的方法,接收 要设置的新密码 作为参数。
注意:设置完一定要调用用户对象的save方法!!!
用法:

user.set_password(password='new_password')
user.save()

修改密码示例代码:

@login_required
def set_password(request):user = request.usererr_msg = ''if request.method == 'POST':old_password = request.POST.get('old_password', '')new_password = request.POST.get('new_password', '')repeat_password = request.POST.get('repeat_password', '')# 检查旧密码是否正确################if user.check_password(old_password):if not new_password:err_msg = '新密码不能为空'elif new_password != repeat_password:err_msg = '两次密码不一致'else:# 修改密码 #############user.set_password(new_password)user.save()return redirect("/login/")else:err_msg = '原密码输入错误'content = {'err_msg': err_msg,}return render(request, 'set_password.html', content)

logout(request)

该函数接受一个HttpRequest对象,无返回值。

当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。
用法:

from django.contrib.auth import logoutdef logout_view(request):logout(request)# Redirect to a success page.

create_user()

auth 提供的一个创建新用户的方法,需要提供必要参数(username、password)等。

用法:

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

create_superuser()
auth 提供的一个创建新的超级用户的方法,需要提供必要参数(username、password)等。

用法:

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

扩展默认的auth_user表

这内置的认证系统这么好用,但是auth_user表字段都是固定的那几个,在项目中可能没法拿来直接使用。

比如,我想要加一个存储用户手机号的字段,怎么办?你可能会想到新建另外一张表然后通过一对一和内置的auth_user表关联,这样虽然能满足要求但是有没有更好的实现方式呢?

我们可以通过继承内置的 AbstractUser 类,来定义一个自己的Model类。
这样既能根据项目需求灵活的设计用户表,又能使用Django强大的认证系统了。

from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):"""如果继承了AbstractUser,那么执行数据库迁移命令时,auth_user就不会被创建出来了,而userinfo表中会出现auth_user表中的所有字段外加扩展字段前提:1.继承之前没有执行过数据库迁移命令auth_user没有被创建,如果当前库被创建了,重新换一个库***************************************************2.继承的类里不要覆盖AbstractUser里面的字段***************************************************3.需要在配置文件中告诉django要用userinfo替换auth_userAUTH_USER_MODEL = "app名.userinfo"***************************************************"""nid = models.AutoField(primary_key=True)phone = models.CharField(max_length=11, null=True, unique=True)def __str__(self):return self.username

Python攻城师的成长————Django框架(csrf相关装饰器、基于中间件思想编写项目、auth认证模块)相关推荐

  1. Python攻城师的成长————ORM查询

    今日学习目标 熟悉掌握ORM语法操作 文章目录 今日学习目标 学习内容 一.神奇的双下划线查询 二.orm创建外键关系 三.外键字段的增删改查 四.正反向的概念 五.ORM多表查询 正向查询 反向查询 ...

  2. Python攻城师的成长————网络编程(socket套接字、通信循环、链接循环、黏包问题)

    今日学习目标 学习什么是socket套接字,并依靠它去处理TCP协议等网络编程问题 文章目录 今日学习目标 学习内容 一. socket套接字 1.什么是socket 2.套接字发展史及分类 3.套接 ...

  3. Python攻城师的成长————模块突破(collections、time与datetime、random随机数模块)

    今日学习目标: 学习并应用collections.time与datetime.random随机数模块知识 今日学习内容: collections模块 time与datetime模块 random随机数 ...

  4. Python攻城师的成长————面向对象的三大特征(继承、多态)

    学习目标: 了解继承与多态的概念,重点是要学会运用继承去处理问题 学习内容: 继承 在面对对象程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类,而被继 ...

  5. Python攻城师的成长————MySQL数据库关键字

    今日学习目标 熟悉关键字用法,掌握多表查询思路 文章目录 今日学习目标 学习内容 一.查询关键字 查询关键字之having过滤 查询关键字之distinct去重 查询关键字之order by排序 查询 ...

  6. Python攻城师的成长————css语法、伪元素选择器(部分)

    今日学习目标 熟悉并掌握css中各种修改属性的方法. 文章目录 今日学习目标 学习内容 一.伪元素选择器 css操作文本内容 选择器优先级 二.css修改属性 css修改文字属性 css修改字体属性 ...

  7. Python攻城师————前端学习(jQuery框架、第三方框架bootstrap框架)

    今日学习目标 继续学习jQuery框架剩余的内容. 文章目录 今日学习目标 学习内容 一.jQuery操作标签 class操作 样式操作 位置操作 文本值操作 属性操作 文档处理操作 二.jQuery ...

  8. Python攻城师————MySQL数据库(自增、外键、关键字)

    今日学习目标 正式学习MySQL数据库语句. 文章目录 今日学习目标 学习内容 一.自增特性 二.约束条件之外键 外键的定义 外键约束创建 三.查询关键字 查询关键字之select与from 查询关键 ...

  9. csrf跨站请求伪造,CBV添加装饰器,auth认证模块,基于django中间件设计项目功能

    文章目录 csrf跨站请求伪造 csrf的定义 csrf的分类 csrf的攻击过程 csrf的攻击条件 举例说明 Django提供的解决策略 csrf相关装饰器 FBV CBV 方法一(直接在类中的某 ...

最新文章

  1. mysql联合查询数量不一致_Mybatis关联查询,查询出的记录数量与数据库直接查询不一致,如何解决?...
  2. [八省联考2018]劈配 (匈牙利)
  3. 前端学习---css基本知识
  4. 【Matplotlib】【Python】如何使用matplotlib绘制各种图形
  5. git、github、gitlab、gitee的区别
  6. 云浮市云计算大数据中心预计明年6月建成
  7. 图像识别-百度AI开放平台
  8. bootstrap 预定义样式风格
  9. 台达伺服ASD-B2的调试
  10. 如何设置PPT里的表格行高等高
  11. 大学,不是学习的终点,而是起点。
  12. 蚂蚁金服 RPC 框架 Sofa-Bolt 结构分析
  13. iis mysql安装包下载_配置Windows Server2008+iis+php+mysql所需下载安装包
  14. webrtc VAD 算法
  15. “天河一号”算一小时13亿人算340年
  16. Letswave 教程:脑电数据预处理与叠加平均
  17. 鸿蒙王者荣耀想要转区吗,王者荣耀账号怎么转区 角色迁移转区教程
  18. maven assembly打包zip报错 You must set at least one file.
  19. Vue ref 和 $refs 获取元素宽高
  20. SeaMonkey推荐

热门文章

  1. HTML5/CSS3 第一章基础
  2. Matplotlib 和numpy 基础学习笔记
  3. win10装inventor哪个版本_1511?1709?1803?1903?到底哪个Win10版本不砍CPU性能?
  4. 第3.1.1章 WEB系统最佳实践 js控件之slimScroll的使用
  5. HNUST OJ 2206 小明的衣服
  6. 2023年全国硕士研究生招生考试数学(一)试题及参考答案
  7. 《林超:给年轻人的跨学科通识课》导图 03:工程学模型
  8. 一对一直播系统实现美颜预设功能的代码解决方式
  9. docker-compose启动redis设置密码失效
  10. 打印机可以打印不能扫描怎么弄_win10系统下打印机可以打印但不能扫描的解决方法...