创建一个装饰器用于判断用户是否登录
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验证失败问题
第一种解决:在前端中的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>
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_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) # 密码是密文的