登录Ubuntu系统,打开终端,进入python虚拟环境,创建django工程,在工程中创建app,命令如下:workon djangotestdjango-admin startproject djmidcd djmidpython manage.py startapp book
在工程中创键一个中间件文件,并编写处理请求返回响应前代码vi middleware.pymiddleware.py文件如下:def my_middleware(get_response): print('init 被调用') def middleware(request): print('before request 被调用') response = get_response(request) print('after response 被调用') return response return middleware解释一下:my_middleware 函数需要接收 get_response对象,获取response对象。
在工程的settings.py文件,注册book应用,注册middleware中间件,注意settings.py文件路径是针对项目的根目录cd djmidvi settings.py修改部分的settings.py文件如下;INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'book.apps.BookConfig',]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', 'middleware.my_middleware',]
在工程的urls.py文件include应用的urlsvi urls.pyurls.py文件如下:from django.conf.urls import url,includefrom django.contrib import adminurlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^book/', include('book.urls')),]
在应用创建urls.py文件,编写到类视图的url cd ../bookvi urls.pyurl.py文件如下:from django.conf.urls import urlfrom . import viewsurlpatterns = [ url(r'^index/', views.index.as_view()),]
在views.py文件,编写类视图indexvi views.pyviews.py文件如下:from django.shortcuts import renderfrom django.views.generic import Viewfrom django.http import HttpResponseclass index(View): def get(self,request): return HttpResponse('get page') def post(self,request): return HttpResponse('post page')
运行django服务器,会打印出init被调用,这个仅在每次启动服务器开始时执行,这里因为开启了debug模式,所以打印了两次,正常情况下只打印一次。python manage.py runserver
在本机浏览器输入网址:http://127.0.0.1:8000/book/index/进行访问,返回:get page终端在请求时和响应时分别打印出before request 被调用after response 被调用中间件测试成功
中间件可以定义在工程任意位置,只要在settings.py文件正确注册就行
多个中间件执行顺序,处理请求自上而下,返回响应自下而上