C/C++教程

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

本文主要是介绍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) # 密码是密文的

 

这篇关于CBV添加装饰器;中间件介绍;自定义中间件介绍;csrf跨站请求;csrf验证的装饰器;auth模块 # day59的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!