首页 > 其他分享 >Django 框架基础9:视图(V)类视图、中间件

Django 框架基础9:视图(V)类视图、中间件

时间:2023-02-26 11:56:38浏览次数:41  
标签:get request middleware 中间件 视图 Django response

1、类视图

类视图是采用面向对象的思路

  • 定义类视图
    ① 继承自django.views的View。
    ② 不同的请求方式有不同的业务逻辑.类视图的方法就直接采用http请求名字作为函数名,如,get,post,put,patch,delete,head,options,trace等。
    ③ 类视图的第一个参数固定为self,第二个参数必须是请求实例对象request。类视图的方法,必须有返回值,返回值是HttpResponse及其子类。
  • 类视图的url引导
    ① url第一个参数是正则,login/。
    ② 第二个参数是个视图函数名 LoginView.as_view()

定义类视图

from django.views import View
class LoginView(View):

    def get(self, request):
        return HttpResponse('get')

    def post(self, request):
        return  HttpResponse('post')

    def put(self, request):
        return HttpResponse('put')

    def OOOO(self, request):  # 函数名不是http协议
        return HttpResponse('OOOO')

 类视图定义路由

from django.urls import re_path
from book.views import login, index, detail, set_cookie, get_cookie,set_session,get_session,LoginView,CenterView

app_name = 'book'
urlpatterns = [
    re_path('^get_session/$', get_session, name='get_cookie'),
    re_path('^login/$', LoginView.as_view()),
    re_path('^center/$', CenterView.as_view()),

]

 类视图的多继承

"""
业务需求:
个人中心页面 -- 必须登录才能显示
    GET 展示个人中心
    POST 实现个人中心信息的修改
"""
from django.contrib.auth.mixins import LoginRequiredMixin
class CenterView(LoginRequiredMixin, View):
    """
    两个父类按MRO的顺序,也可以理解为业务流程
    登录个人中心首先需要验证是否登录,django的LoginRequireMixin封装好了验证方法
    如果检测到没有登录,会自动跳转到 http://127.0.0.1:8000/accounts/login/?next=/center/
    """

    def get(self, request):
        return HttpResponse('个人中心展示')

    def post(self, request):
        return HttpResponse('个人信息修改')
from django.urls import re_path
from book.views import login, index, detail, set_cookie, get_cookie,set_session,get_session,LoginView,CenterView

app_name = 'book'
urlpatterns = [
    re_path('^get_session/$', get_session, name='get_cookie'),
    re_path('^login/$', LoginView.as_view()),
    re_path('^center/$', CenterView.as_view()),

]

 2、中间件

Django中的中间件是一个轻量级底层的插件系统,可以介入 Django的请求和响应处理过程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了 Django框架的健壮性。
我们可以使用中间件,在 Django处理视图的不同阶段对输入或输出进行干预
中间件文档:https://docs.djangoproject.com/en/3.2/topics/http/middleware/

中间件的定义方法:

  • 定义一个中间件工厂函数,然后返回一个可以被调用的中间件。
  • 中间件工厂函数需要接收一个可以调用的 get_response对象
  • 返回的中间件也是一个可以被用的对象,并且像视图一样需要接收一个 request对象参数,返回一个 response对象。

定义

def simple_middleware(get_response):
    def middleware(request):
        print('before')
        response = get_response(request)
        print('after')
        return response

    return middleware

注册

执行结果:http://localhost:8000/set_session/?username=yuan&pass=123456

多个中间件的执行顺序:

请求前:按注册顺序执行
请求后/响应后:与注册顺序相反

def simple_middleware(get_response):
    def middleware(request):
        print('before1111')
        response = get_response(request)
        print('after1111')
        return response

    return middleware


def simple_middleware2(get_response):
    def middleware(request):
        print('before2222')
        response = get_response(request)
        print('after22222')
        return response

    return middleware
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',
    'book.middleware.simple_middleware',
    'book.middleware.simple_middleware2',
]

中间件初始化

def simple_middleware(get_response):
    print('init_1111')  # 从程序运行后只执行一次
    def middleware(request):
        print('before1111')
        response = get_response(request)
        print('after1111')
        return response

    return middleware

 中间件实例说明

# -*- encoding: utf-8 -*-
"""
中间件的作用:每次请求和响应的时候都会调用
中间件的定义:嵌套视图函数
中间件的注册:在settings.py的MIDDLEWARE=[]列表中添加 'book.middleware.simple_middleware',
中间件的使用举例:可以判断每次请求中是否携带了cookie的某些信息
"""
from django.http import HttpResponse
def simple_middleware(get_response):
    # 这里是中间件第一次调用执行的地方,程序启动,首次发送请求会执行一次,以后的请求不会执行
    print('init___middleware')

    def middleware(request):
        # 这里是请求前
        print('before request')
        username = request.COOKIES.get('username')
        if username is None:
            print('usename is None!')
            # return HttpResponse('亲,你没有登录啊!')
        else:
            print(username)

        response = get_response(request)

        # 这里是响应后/请求后
        print('after response/request')

        return response

    return middleware

 

标签:get,request,middleware,中间件,视图,Django,response
From: https://www.cnblogs.com/zhoubai/p/17156392.html

相关文章