CBV添加装饰器
创建一个装饰器用于判断用户是否登录
def login_auth(func):
def inner(request, *args, **kwargs):
if request.COOKIES.get('username'):
return func(request, *args, **kwargs)
else:
return redirect('/login/')
return inner
定义一个类,并给类添加装饰器
1、导入模块
from django.views import View # 定义的class类必须继承View
from django.utils.decorators import method_decorator # 用于给类中的方法增加装饰器
2、定义一个类
3、给类中的函数增加装饰器
方法一:在每个要增加装饰器的函数方法上面加上@method_decorator(装饰器名称)
方法二:在类上面加上@method_decorator(装饰器名称, name='要加装饰器的函数方法名称')
方法三:在类中重新定义一个父类的方法dispatch给其增加装饰器就是给类中所有函数方法都添加装饰器
eg:
from django.views import View
from django.utils.decorators import method_decorator
# @method_decorator(login_auth, name='get') # 第二种添加装饰器
# @method_decorator(login_auth, name='post')
class MyLogin(View):
# 给类中的所有方法都添加装饰器,第三种方式
@method_decorator(login_auth)
def dispatch(self, request, *args, **kwargs):
super().__init__()
# @method_decorator(login_auth) # 第一种添加装饰器
def get(self, request):
return HttpResponse('get')
def post(self, request):
return HttpResponse('post')
中间件介绍
django默认七个中间件
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.middleware.csrf.CsrfViewMiddleware'为例
from django.middleware.csrf import CsrfViewMiddleware
其中django.middleware.csrf是次中间件文件存放的路径,CsrfViewMiddleware是py文件中定义的一个类
特点:
1、都继承MiddlewareMixin
2、里面可以写几种函数方法
需要掌握
def process_request()
def process_response()
了解即可
def process_view()
def process_template()
def process_except()
自定义中间件
步骤
1、在项目名或者是应用名下建一个文件夹
2、在文件中创建一个py文件
3、写一个类,继承MiddlewareMixin
4、在settings.py中注册中间件
中间件的执行顺序
process_request 从上往下
process_response 从下往上
如果在process_request方法中,返回了结果,后面的中间件不再走了,但是,同级别的process_reponse还是走的
eg:
创建类
# 1. 必须要继承MiddlewareMixin
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import render, HttpResponse
class Mydd(MiddlewareMixin):
def process_request(self, request):
print("第一个process_request")
return HttpResponse("第一个process_request")
def process_response(self, request, response):
print("第一个process_response")
return response
class Mydd1(MiddlewareMixin):
def process_request(self, request):
print("第二个process_request")
def process_response(self, request, response):
print("第二个process_response")
return response
在settings.py中的MIDDLEWARE中注册中间件
'app01.mymiddleware.mydd.Mydd',
'app01.mymiddleware.mydd.Mydd1'
csrf跨站请求
解决csrf验证失败问题
第一种解决:在前端中的form表单内添加字段 {% csrf_token %}
<form action="/MyLogin/" method="post">
{% csrf_token %}
<p>username: <input type="text" name=""></p>
<p>password: <input type="password" name=""></p>
<input type="submit">
</form>
<button class="btn">按钮</button>
<script>
var index;
$('.btn').click(function () {
$.ajax({
// 第一种方式
//data:{'username':'egon', 'csrfmiddlewaretoken':$('[name="csrfmiddlewaretoken"]').val()},
// 第二种方式
data: {'username': 'egon', 'csrfmiddlewaretoken': '{{ csrf_token }}'},
// 在发送ajax之前,执行的
beforeSend: function () {
//loading层
index = layer.load(1, {
shade: [0.1, '#fff'] //0.1透明度的白色背景
});
},
success: function (res) {
// 关闭
layer.close(index)
}
})
})
</script>
csrf验证的装饰器
1. 所有的方法都验证,但是有几个函数不验证
2. 所有函数都不验证,但是有几个需要验证
from django.views.decorators.csrf import csrf_exempt, csrf_protect
"""
需要验证的都加这个装饰器
csrf_protect:
不需要验证的加这个装饰器
csrf_exempt
"""
# 该方法不验证csrf
# @csrf_exempt
@csrf_protect
def home(request):
if request.method == 'POST':
time.sleep(3)
return JsonResponse({'username': 'egon'})
return render(request, 'home.html')
# csrf_protect的验证
###CBV的验证csrf的装饰器####
三种方式都可以
class MyLogin(View):
# 给类中的所有方法都添加装饰器
# @method_decorator(login_auth)
@method_decorator(csrf_protect)
def dispatch(self, request, *args, **kwargs):
super().__init__()
# @method_decorator(login_auth) # 第一种添加装饰器
def get(self, request):
return HttpResponse('get')
# 验证csrf
# @method_decorator(csrf_protect)
def post(self, request):
return HttpResponse('post')
# csrf_exempt的验证,只能用子第三张方式
# @method_decorator(csrf_exempt, name='post') # 第二种方式也不行
class MyLogin(View):
# 给类中的所有方法都添加装饰器
# @method_decorator(login_auth)
# @method_decorator(csrf_protect)
@method_decorator(csrf_exempt)
def dispatch(self, request, *args, **kwargs):
super().__init__()
auth模块
auth的认证,依赖于auth_user表
from django.contrib import auth
# 认证
res = auth.authenticate(request, username=username, password=password)
# auth.login(request, res)
# 验证的装饰器
from django.contrib.auth.decorators import login_required
@login_required(login_url='/login/')
def func(request):
return HttpResponse('func')
修改密码
is_right = request.user.check_password(old_pwd)
if is_right:
# 判断两次密码是否一致
if new_pwd == re_pwd:
# 修改密码
request.user.set_password(new_pwd) # 这一行并没有操作数据库
request.user.save() # 操作数据库了
return redirect('/login/')
注销功能
def logout(request):
auth.logout(request) #
注册
from django.contrib.auth.models import User
User.objects.create_user(username=username, password=password) # 密码是密文的