中间件
注意
操作在app:look下进行
图示响应原理
概念
介于URL匹配和VIEWS视图之间,具有拦截作用;
请求处理和响应处理逆序;
不能随意更改设置中的中间件顺序;
但可以删除无用中间件(不知道会不会加快处理速度);
中间件定义
### 放置于settings文件中
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware', # 实现会话应用的会话中间件
'django.middleware.common.CommonMiddleware', # 对URL执行重写的中间件
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware', # 验证用户身份的认证中间件
'django.contrib.messages.middleware.MessageMiddleware', # 用来支持消息应用的中间件
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
自定义中间件
中间件中可以定义5个方法,分别是:
###请求预处理函数:在通过url找到views之前被调用
1. process_request(self,request) :
###在每个请求上调用,返回None[继续处理当前请求,顺序执行其他中间件,再执行process_view]或HttpResponse对象[返回执行process_response方法,直到第一个中间件并且返回响应]
### 源码查看路径:django\middleware\cache.py
### 视图预处理函数:确定当前请求对应的视图函数再被调用
2. process_view(self, request, callback, callback_args, callback kwargs):
调用视图之前被调用,在每个请求上调用,返回None或HttpResponse对象
3. process_template_response(self,request,response):
在视图刚好执行完毕之后被调用,在每个请求上调用,返回实现了render方法的响应对象
4. process_exception(self, request, exception)
当视图抛出异常时调用,在每个请求上调用,返回一个HttpResponse对象
5. process_response(self, request, response)
所有响应返回浏览器之前被调用,在每个请求上调用,返回HttpResponse对象
自定义中间件代码示例
### 操作逻辑
from django.http import HttpResponse
from django.utils.deprecation import MiddlewareMixin
class MyException(MiddlewareMixin) :
'''
1. 在主目录下创建了一个e.py的文件.
2. 在.py的文件中创建一个MyException的类
3. 自定义时你想要加在哪一块加功能就定义相对于的方法,不用全部都定义.
'''
def process_request(self, request) :
print('自定义的process_ request')
return None
def process_view(self, request, callback, callback_args, callback_kwargs):
print("自定义process_view")
return None
#如果视图函数中的返回值中有render方法,才会执行process_template_response
def process_template_response(self, request, response) :
print ('M2process_template_response')
return response
def process_response(self, request, response) :
print('自定义的process_response')
return response
def process_exception(self, request, exception) :
print('自定义process_exception')
return HttpResponse (exception)
代码实战
### look.mymiddleware.py
from django.http import HttpResponse
from django.utils.deprecation import MiddlewareMixin
class MyException(MiddlewareMixin):
def process_request(self, request):
print('自定义的process_request')
return None
def process_view(self, request, callback, callback_args, callback_kwargs):
print('自定义process_view')
return None
def process_template_response(self, request, response):
print('自定义process_template_response')
return response
def process_response(self, request, response):
print('自定义process_response')
return response
def process_exception(self, request, exception):
print('自定义process_exception')
return HttpResponse(exception)
### e.py
from book.models import User
class UserMiddware(object):
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# request 到达视图函数views之前执行的代码
username = request.session.get('usernmae', '未登录')
# 判断User表中是否存在该用户名
user = User.objects.filter(username=username).first() # 只抽取符合要求的第一个名字
if user:
setattr(request, 'myuser', user.username)
else:
setattr(request, 'myuser', '未登录')
response = self.get_response
return response
### 注册中间件,在settings中操作
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware', # 实现会话应用的会话中间件
'django.middleware.common.CommonMiddleware', # 对URL执行重写的中间件
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware', # 验证用户身份的认证中间件
'django.contrib.messages.middleware.MessageMiddleware', # 用来支持消息应用的中间件
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'tzlook.look.mymiddleware.MyException',
'tzlook.look.e.UserMiddware',
]
补充—-WSGI
### 概念
Web服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。
### settings.py中的
WSGI_APPLICATION = 'tzlook.wsgi.application'
### tzlook/wsgi.py
"""
WSGI config for tzlook project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/2.1/howto/deployment/wsgi/
"""
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'tzlook.settings')
application = get_wsgi_application()
上下文处理器
概念
在模板中想要使用的变量是从视图函数中的context这个上下文的参数中传递进来的,每个视图函数需要什么参数就传什么参数.
简而言之,上下文处理器就是创建模板变量.
用途
在settings.py中,包含了当前使用的上下文处理器。他的作用是可以给每一个模板都提供相同的变量
示例代码
### 主目录下新建该py文件,在该文件中写入一个myuser函数,必须传入request参数,必须返回一个字典类型的对象
from ts22.models import UserMode1
def myuser (request):
username = request.session.get('username','未登录')
user = UserModel.objects.filter(username=username).first()
if user:
return {'myuser':username}
else:
return {}
### 在settings中注册上下文管理器
'''
mysite是项目名,先找到文件所在的位置,把自定义上下文处理器的函数添加到该文件中
路径为:TEMPLATES--->OPTIONS--->context_processors
'''
TEMPLATES = [
{
'BACKEND':django.template.backends.django.DjangoTemplates,
'DIRS':[os.path.join(BASE_DIR,'templates')]
,
'APP_DIRS':True,
'OPTIONS': {
'context_ processors':[
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'mysite.mycontextprocessor.myuser',
],
},
},
]
总结
- 我们刚才分别用中间件和上下文完成了跟登录用户有关的例子,最后的结果都是能在页面t显示用户的用户名了;
- 中间件是在用户请求到响应的过程中去加入一些额外的逻辑功能,例子中给request增加了一个[myuser]的属性;
- 上下文是给所有的模板增加变量,例子中给模板增加了一个[myuser]的变量;
参考教程
https://www.cnblogs.com/guyuyun/p/13903561.html
admin后台
作用
为你的员工或客户生成一个用户添加, 修改和删除内容的后台是一项缺乏创造性和乏味的工作。因此,Django 全自动地根据模
型创建后台界面。Django产生于一个公众页面和内容发布者页面完全分离的新闻类站点的开发过程中。
站点管理人员使用管理系统来添加新闻、事件和体育时讯等,这些添加的内容被显示在公众页面上。
Django通过为站点管理人员创建统-的内容编辑界面解决了这个问题。
管理界面不是为了网站的访问者,而是为管理者准备的。
创建管理员
### 先激活虚拟环境,manage.py在tzlook下
python manage.py createsuperuser
### 依次输入用户名,邮箱和密码
修改中文界面
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = True
注意
在book下admin.py下操作
向后台注册模型
from django.contrib import admin
# Register your models here.
from .models import BookInfo, User
admin.site.register(BookInfo)
admin.site.register(User)
效果
数据库验证添加操作
总结
中间件以及上下文处理器
中间件
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware', # 实现会话应用的会话中间件
'django.middleware.common.CommonMiddleware', # 对URL执行重写的中间件
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware', # 验证用户身份的认证中间件
'django.contrib.messages.middleware.MessageMiddleware', # 用来支持消息应用的中间件
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'tzlook.look.mymiddleware.MyException',
'tzlook.look.e.UserMiddware',
]
# 执行流程
user发送一个请求,进入process_request -> process_views
从下至上,views返回响应 从中间件--->返回结果
#课外补充
代理服务器,节省访问时间,减轻服务器压力
用户<--->代理服务器-wsgi-settings--->中间件--->url-->views--->中间件
# admin后台
URL匹配路径:/admin/
# 注册模型类;同时引入admin,以及模型包
# 共享一个URL匹配规则,多个项目的admin注册模型类
from django.contrib import admin
from look.models import
Register your models here.
from .models import Student, Department
参考教程
### 模块初始化函数传入过多的参数
https://blog.csdn.net/qq_43697400/article/details/86516686
### WSGI无法加载
https://blog.csdn.net/mumu_0527/article/details/107453077
https://www.it1352.com/2048849.html
### 菜鸟教程---admin
https://www.runoob.com/django/django-admin-manage-tool.html