Django___中间件,MVC与MTV

 一. 中间件

--- 应用:对所有请求或一部分请求做批量处理

1.建立md.py

 2.在md.py中,写入 中间件 M1,M2(#process_view

from django.utils.deprecation import MiddlewareMixin

class M1(MiddlewareMixin):

    def process_request(self,request):
        print('m1.process_request')


    def process_view(self,request,callback,callback_args,callback_kwargs):
        print('m1.process_view')
        response =callback(request,*callback_args,**callback_kwargs)
        return response

    def process_response(self,request,response):
        print('m1.process_response')
        return response



class M2(MiddlewareMixin):

    def process_request(self,request):
        print('m2.process_request')


    def process_view(self,request,callback,callback_args,callback_kwargs):
        print('m2.process_view')


    def process_response(self,request,response):
        print('m2.process_response')
        return response
View Code

补充:MiddlewareMixin:  由于dedeprecation 将要废弃,无法导入。为了兼容。可将源码添加到M1,M2,让其直接继承

class MiddlewareMixin(object):   
    def __init__(self, get_response=None):
        self.get_response = get_response
        super(MiddlewareMixin, self).__init__()

    def __call__(self, request):
        response = None
        if hasattr(self, 'process_request'):
            response = self.process_request(request)
        if not response:
            response = self.get_response(request)
        if hasattr(self, 'process_response'):
            response = self.process_response(request, response)
        return response
View Code

3.在settings.py配置

 4.views.py与urls.py

from django.shortcuts import render,HttpResponse


def test(request):
    print('输出:','test')

    return HttpResponse('**** &&&&& ****')
View Code
from app01 import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),

    url(r'^test/',views.test),


]
View Code

 5.执行效果

原因:在执行 process_view过程中,如果有返回值,此后的 process_view,不在执行。直接跳到 process_response

                                                  

 

 二. MVC,MTV模式

 Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为:model(模型),view(视图),controller(控制 器)。

其中:
             M 管理应用程序的状态(通常存储到数据库中),并约束改变状态的行为(或者叫做“业务规则”)。
             C 接受外部用户的操作,根据操作访问模型获取数据,并调用“视图”显示这些数据。控制器是将“模型”和“视图”隔离,并成为二者之间的联系纽带。
             V 负责把数据格式化后呈现给用户。

在《Agile Web Development with Rails》中有这样一张图对MVC模式进行了很好的解释:

Django的MTV模式本质是各组件之间为了保持松耦合关系,Django的MTV分别代表:

       Model(模型):负责业务对象与数据库的对象(ORM)

       Template(模版):负责如何把页面展示给用户

       View(视图):负责业务逻辑,并在适当的时候调用Model和Template

       此外,Django还有一个url分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template.

 

需要注意的是,不能简单的把 Django 视图认为是MVC控制器,把 Django 模板认为MVC视图。 
区别在于:
     Django 视图 不处理用户输入,而仅仅决定要展现哪些数据给用户;
     Django 模板 仅仅决定如何展现Django视图指定的数据。


或者说, Django将MVC中的视图进一步分解为 Django视图 和 Django模板两个部分,分别决定 “展现哪些数据” 和 “如何展现”,使得Django的模板可以根据需要随时替换,而不仅仅限制于内置的模板。

 

至于MVC控制器部分,由Django框架的URLconf来实现。URLconf设计非常巧妙,其机制是使用正则表达式匹配URL,然后调用合适的Python函数。虽然一开始有些不习惯,但是你很快就会喜欢上它,因为URLconf对于URL的规则没有任何限制,你完全可以设计成任意的URL风格,不管是传统的,RESTful的,或者是另类的。

 

原文地址:https://www.cnblogs.com/zhaochangbo/p/7111735.html