Django CBV装饰器 中间件 auth模块 CSRF跨站请求
CBV添加装饰器
给CBV添加装饰器有三种方法,三种方法都需要导入模块:
from django.utils.decorators import method_decorator
第一种直接在方法上面添加:
from django.utils.decorators import method_decorator
class MyLogin(View):
@method_decorator(auth)
def get(self, request):
return HttpResponse('Is from get')
def post(self, request):
return HttpResponse('Is from post')
第二种是在类上面添加:
from django.utils.decorators import method_decorator
@method_decorator(auth, name='get') # 方法名
class MyLogin(View):
def get(self, request):
return HttpResponse('Is from get')
def post(self, request):
return HttpResponse('Is from post')
第三种是重写as_view()里面的dispatch方法,这种添加完装饰器之后类里面的所有方法都被添加上了。
from django.utils.decorators import method_decorator
class MyLogin(View):
@method_decorator(auth)
def dispatch(self, request, *args, **kwargs):
super.__init__()
def get(self, request):
return HttpResponse('Is from get')
def post(self, request):
return HttpResponse('Is from post')
Django中间件
介绍
Django默认有7个中间件:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
浏览器从请求到响应的过程中,Django需要通过这7个中间件处理,这7个中间件都默认继承了MiddlewareMixin。
Django支持程序员自定义中间件并且暴露程序员五个可自定义的方法。
- process_request
- process_response
- process_view
- process_template_response
- process_exception
如何自定义中间件
在项目名或者应用名下创建一个任意名称的文件夹(在应用下创建路径有提示,但如果在项目下创建就没有提示了)
在该文件夹内创建一个任意名称的py文件
在该py文件内书写类(该类必须继承MiddlewareMixin)
from django.utils.deprecation import MiddlewareMixin
然后在这个类里面就可以自定义五个方法了
(这五个并不是全部都需要书写,用几个写几个)
需要将类的路径以字符串的形式注册到配置文件中才能生效(也就是setting.py里面的MIDDLEWARE里面)
process_request
- 请求过来的的时候需要经过每一个中间件里面的process_request方法结果顺序是按照配置文件中注册的中间件自上而下依次执行。
- 如果中间件没有定义process_request方法,那么会直接跳过执行该中间件。
- 如果该方法返回了HttpResponse对象,那么该请求将不再继续往后执行而是直接原路返回(校验失败不允许访问)process_request方法就是用来做全局相关的所有限制功能
process_response
响应走的时候需要经过每一个中间件里面的process_response方法。该方法有两个额外的参数request, response。
该方法必须返回一个HttpResponse对象
- 默认返回形参response
- 也可以自定义返回HttpResponse
顺序是按照配置文件中注册的中间件自下而上依次执行。
如果没有定义的话,直接跳过执行。
process_view
在路由匹配成功之后执行视图函数之前,会自动执行中间件里面的该方法,顺序自上而下依次执行
process_template_response
返回的HttpResponse对象有render属性的时候才会触发
process_exception
当视图函数中出现异常的情况下触发
csrf跨站请求伪造
因为CSRF攻击利用的是冲着浏览器分不清发起请求是不是真正的用户本人,所以防范的关键在于在请求中放入黑客所不能伪造的信息。从而防止黑客伪造一个完整的请求欺骗服务器。
而Django就使用token验证来防范CSRF。
CSRF在Django中作为一个独立的组件,MIDDLEWARE里面将它注释掉,它便不再执行。
如果想要提交的post请求能够通过csrf验证,需要在html页面里面的from表单里添加一段验证字符串。
csrf验证 form表单
<form action="" method="post">
{% csrf_token %}
<input type="text" placeholder="用户名">
<input type="password" placeholder="密码">
<input type="submit">
</form>
Ajax csrf验证
<script>
$('.btn').click(function (){
$.ajax({
url:'',
type:'post',
// 第一种方式
// data:{'username':'jesse', 'csrfmiddlewaretoken':$('[name="csrfmiddlewaretoken"]')},
// 第二种
data:{'username':'jesse', 'csrfmiddlewaretoken':'{{ csrf_token }}'},
success:function(){
}
})
})
</script>
CSRF跨站请求的装饰器
csrf中间件会验证所有的方法都验证,但是我们会碰到所有的方法都验证,但是有几个函数不验证的。这时候就要用到装饰器。
需要验证的加这个装饰器:
@csrf_protect
不需要验证的加这个装饰器:
@csrf_exempt
# 如果该函数有返回的html不能再加{% csrf_token %}
csrf_protect装饰器也可以加在CBV当中,与CBV添加装饰器的用法一致。
csrf_exempt装饰器只能改写dispatch方法来添加。
Django Auth组件
Django用户认证组件一班用在用户的登录注册上,用于判断当前用户是否合法,调用该组件需要导入auth模块,而且auth的认证功能,依赖于auth_user表。
首先创建一个超级用户,这样就可以登录Djangoadmin后台了,点击pycharm上面的tools菜单内的Run manage.py Task,输入命令(首先库内得有auth_user表才能创建)
createsuperuser
# 根据提示输入密码邮箱
使用需要导入auth模块:
from django.contrib import auth
auth模块实际使用(验证用户,设置session)
from django.shortcuts import render, HttpResponse, redirect
# Create your views here.
from django.views import View
from django.contrib import auth
def login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
# 利用auth模块验证用户是否合法
'''
1.自动去auth_user表中进行验证
2.把密码自动加密进行比对
'''
# 该方法验证正确会返回用户对象,错误会返回None
user_obj = auth.authenticate(request, username=username, password=password)
print(user_obj)
if user_obj:
auth.login(request, user_obj) # 相当于设置session,记录用户状态
return redirect('/home/')
return render(request, 'login.html')
除了验证用户和设置session之外auth模块还可以设置验证装饰器。
from django.contrib.auth.decorators import login_required
# 同样的使用auth自带的装饰器也需要导入login_required
@login_required(login_url='/login/')
# 该装饰器使用的时候需要传 没有登录 返回的路由,不传默认访问自带的地址account/login
def func(request):
return HttpResponse('FUNC PAGE')
修改密码
is_right = request.user.check_password(old_pwd)
if is_right:
# 判断两次密码是否一致
if new_pwd == re_pwd:
# 修改密码
request.user.set_password(new_pwd)
requesr.user.save() # 保存到数据库
return redirect('/login/')
注销功能
def logout(request):
auth.logout(request) # 清除cookie
return redirect('/home/')
注册入库
from django.contrib.auth.model import User
# 需要导入模块
def register(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
User.object.create(username=username,password=password) # 密码是名文
# create_user 密码是密文
auth_user表的扩展
auth_user表的字段是系统帮我们创建的,在使用的过程中难免会碰到字段不能满足我们需求的情况,那么这种情况该如何对该表进行扩展呢?
扩展auth_user表需要在models.py中进行,首先我们需要导入一个模块:
form django.contrib.auth.models import AbstractUser
增加字段需要继承AbstractUser
class UserInfo(AbstractUser):
phone = models.CharField(max_lenth=32)
addr = models.CharFiled(max_lenth=32)
# 增加字段
增加完字段之后必须在settings.py中写一个配置
AUTH_USER_MODEL = 'app01.UserInfo'
# 应用名称.类名
需要注意的是:一旦扩展类执行过迁移命令就不能再扩展了
Django CBV装饰器 中间件 auth模块 CSRF跨站请求的更多相关文章
- csrf跨站请求伪造、csrf相关装饰器、auth认证模块、基于django中间件设计项目功能
目录 csrf跨站请求网站 什么是csrf跨站请求网站 经典例子-钓鱼网站 模拟 如何避免这种现象(预防) 如何在django中解决这个问题 form表单 ajax csrf相关装饰器 FBV CBV ...
- csrf跨站请求、相关装饰器、auth模块使用
昨日内容回顾 django操作cookie和session # 作用:就是保存用户信息,保存一系列数据,还可以做缓存 保留一段时间 # session是基于cookie工作的 1. 数据是保存在服务端 ...
- Django中间件、csrf跨站请求、csrf装饰器、基于django中间件学习编程思想
django中间件 中间件介绍 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出. ...
- Web框架之Django_09 重要组件(Django中间件、csrf跨站请求伪造)
摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于 ...
- Web框架之Django重要组件(Django中间件、csrf跨站请求伪造)
Web框架之Django_09 重要组件(Django中间件.csrf跨站请求伪造) 摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是 ...
- Django框架(十六)-- 中间件、CSRF跨站请求伪造
一.什么是中间件 中间件是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出 二.中间件的作用 如果你想修改请求,例如被传送到view ...
- Django框架(十七)—— 中间件、CSRF跨站请求伪造
目录 中间件 一.什么是中间件 二.中间件的作用 三.中间件执行顺序 四.自定义中间件 1.导包 2.定义类,继承MiddlewareMixin 3.在视图函数中定义一个函数 4.在settings的 ...
- [Django高级之中间件、csrf跨站请求伪造]
[Django高级之中间件.csrf跨站请求伪造] Django中间件 什么是中间件? Middleware is a framework of hooks into Django's request ...
- python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页)
一.ajax登录示例 新建项目login_ajax 修改urls.py,增加路径 from app01 import views urlpatterns = [ path('admin/', admi ...
随机推荐
- Python中的json学习
p.p1 { margin: 0; font: 14px ".PingFang SC"; color: rgba(53, 53, 53, 1) } p.p2 { margin: 0 ...
- bugku--cookie欺骗
打开题目一看,是一串的东西,再看了一下filename发现不对劲了,明显是base64编码,拿去解码一下, 发现是这个,说明是filename,是需要解析的哪个文件名,把index.php编码一下,试 ...
- XCTF 进阶区 CAT
这题脑洞是真的大,讲道理 看到这个,先尝试了一下命令拼接,发现字符被过滤了应该.fuzz一下看看,有哪些字符还没被过滤了 import requests dictory=["!", ...
- 第二章 python基本语法元素
python有两种编程方式,交互式和文件式. 交互式:对每个输入语句即时运行结果------适合语法练习 文件式:批量执行一组语句并运行结果------编程的主要方式 实例1:圆面积的计算(根据半径r ...
- SpEL表达式总结(转)
前言 SpEL(Spring Expression Language),即Spring表达式语言,是比JSP的EL更强大的一种表达式语言.为什么要总结SpEL,因为它可以在运行时查询和操作数据,尤其是 ...
- Maven项目导入Intellij IDEA
目录 1. 自动创建maven项目 2. 修改IDEA默认远程仓库,提高依赖包下载速度 3. 修改IDEA中maven设置 4. 将maven项目导入IDEA 坑:IDEA无法下载依赖包 1. 自动创 ...
- 利用C语言判定用户输入数据从而给出结果(利用判定用户体重范围)同求最优解!!!
例子: 要求:医务工作者通过广泛的调查和统计分析,根据成人的身高与体重因素给出了按"体质指数"进行判断的方法,具体如下: 体质指数t=体重 w/(身高h)2(w的单位为kg,h的单 ...
- uni-app中当uni.navigateTo传的参数为object时,通过传递的不同参数,在显示单页面内通过v-if判断显示出对应的内容(可实现多页面效果)
通过uni-app中当uni.navigateTo传的参数为object时,通过传递的不同参数,在显示单页面内通过v-if判断显示出对应的内容(可实现多页面效果) 起始页跳转到对应页面,并传递参数(o ...
- C++之vector容器
一.STL的基本概念 STL(Standard Template Library)标准模板库大体上分为六大组件,分别为容器,算法,迭代器,仿函数,适配器和空间配置器,其中最重要的是容器,算法和迭代器, ...
- 如何修改product.product的display_name的显示,解决_rec_name失效的问题
回顾学习 之前有讲解过display_name是怎么由来的,odoo会去取_rec_name的值,会将_rec_name的值赋值给display_name. class FandxProduct(mo ...