博客信息

Python Django 模板层(自定义中间件)

发布时间:『 2019-08-21 05:06』  博客类别:Python  阅读(838)

个人小结:Python中的中间件事Java中的过滤器与拦截器的结合体;

 

Java中的过滤器的特点:作用于全局,用来拦截所有的request请求,但是它对放行后的操作就不再处理了;

Java中的拦截器的特点:作用于局部,用来拦截部分action请求,除了对request请求进行拦截,放行后的操作依然会经过同一个拦截器;

Python中间件的特点:作用与全局,除了对request请求进行拦截,放行后的操作依然会经过同一个拦截器;

 

代码论证:

1、项目根目录下创建python packagemyWares

2、自定义一个python文件

# coding=utf-8

from django.utils.deprecation import MiddlewareMixin


class Row1(MiddlewareMixin):
    def process_request(self, request):
        print("中间件1")

    def process_view(self, request, callback, callback_args, callback_kwargs):
        print("中间件视图1")

    def process_response(self, request, response):
        print("中间件1返回")
        return response


# 参数里的 response :就是views里面返回的值,所以要继续返回一下,否则客户端收不到数据

class Row2(MiddlewareMixin):
    def process_request(self, request):
        print("中间件2")

    def process_view(self, request, callback, callback_args, callback_kwargs):
        print("中间件视图2")

    def process_response(self, request, response):
        print("中间件2返回")
        return response


class Row3(MiddlewareMixin):
    def process_request(self, request):
        print("中间件3")

    def process_view(self, request, callback, callback_args, callback_kwargs):
        print("中间件视图3")

    def process_response(self, request, response):
        print("中间件3返回")
        return response

 

3、settings文件中配置自定义中间件

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',
    'myWares.testWare.Row1',
    'myWares.testWare.Row2',
    'myWares.testWare.Row3'
]

 

4、配置URL

urlpatterns = [
    url(r'^getdata/$', views.getdata_view),
    url(r'^baseTemp/$', views.baseTemp_view),
    url(r'^extendsTemp/$', views.extendsTemp_view),
    url(r'^ware/$', views.IndexView.as_view()),
]


5、创建视图

class IndexView(View):
    def get(self,request,*args,**kwargs):
        print u'最终返回值'
        return HttpResponse('OK')


6、浏览器访问

 

 

http://127.0.0.1:8000/ctx/ware/

 

 

测试结果如下:

小李飞刀_Python

自定义中间件流程图

小李飞刀_Python


其他:

views函数如果出现异常,返回会找exception方法,一级一级往上找,如果有处理返回,如果都没有处理就直接返回报错了。


def process_exception(self, request, exception):
    if isinstance(exception, ValueError):
        return HttpResponse("出现异常")
# 异常处理 views函数里出错了,执行这里,如views里 int('abc')

process_template_response(self,request,response)
# 如果views中的函数返回的对象中,具有render方法,执行这个方法。


over......


关键字:     Python       Django  

备案号:湘ICP备19000029号

Copyright © 2018-2019 javaxl晓码阁 版权所有