• 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的,或者是另类的。

     

  • 相关阅读:
    javaweb快速入门-学习笔记
    初学者如何学习JAVA(本文网摘收藏)
    实施职业发展路线-三界之外无量天
    GUI(图形界面编程)
    selenium IE自动化问题汇总
    python 读取excel数据插入到另外一个excel
    一个简单的查询功能的测试思路
    python os用法笔记
    Python学习笔记(基本功能的使用)
    python 调用封装好的模块
  • 原文地址:https://www.cnblogs.com/zhaochangbo/p/7111735.html
Copyright © 2020-2023  润新知