一. 中间件
--- 应用:对所有请求或一部分请求做批量处理
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
补充: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
3.在settings.py配置
4.views.py与urls.py
from django.shortcuts import render,HttpResponse def test(request): print('输出:','test') return HttpResponse('**** &&&&& ****')
from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^test/',views.test), ]
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的,或者是另类的。