CBV添加装饰器;中间件介绍;自定义中间件介绍;csrf跨站请求;csrf验证的装饰器;auth模块 # day59

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) # 密码是密文的

 

上一篇:Lab: Cross-site WebSocket hijacking:跨站WebSocket劫持


下一篇:安全规约