18中间件、上下文处理器和Djangoadmin
中间件的引入
- 在app文件夹下建立middleware.py
一个中间件就是一个可调用的对象,它会接收一个request并返回一个请求
可以是一个函数
# 外部函数是中间件工厂,内部的是中间件
def simple_middleware(get_response):
# 一次性的设置和初始化 start project 只执行一次的代码
print('一次性设置的代码1')
def middleware(request):
# 处理每个请求之前被执行的代码
# 试图将会被调用,或者后面的中间件会执行
print('视图调用前(请求之前)的代码1')
response = get_response(request)
# 处理请求,相应之后的代码
# 试图已经被调用了
print('视图调用后(响应之后)的代码1')
return response
return middleware
- 在项目settings.py的MIDDLEWARE列表中注册中间件,增加一个字符串
'appname.middleware.simple_middleware'
实现一个功能:只有谷歌浏览器才让访问/user_agent
from django.http import HttpResponseForbidden
# 外部函数是中间件工厂,内部的是中间件
def simple_middleware(get_response):
# 一次性的设置和初始化 start project 只执行一次的代码
def middleware(request):
# 处理每个请求之前被执行的代码
# 试图将会被调用,或者后面的中间件会执行
user_agent = request.META['HTTP_USER_AGENT']
if not 'chrome' in user_agent.lower():
return HttpResponseForbidden()
response = get_response(request)
# 处理请求,相应之后的代码
# 试图已经被调用了
return response
return middleware
如果在非谷歌浏览器上访问服务器,就会被拒绝显示
还可以将中间件写成一个类
class SimpleMiddleWare:
def __init__(self, get_response):
self.get_response = get_response
# 一次性的设置和初始化 start project
print('一次性设置的代码2')
def __call__(self, request):
# 在每一个请求上都会调用
# 处理请求之前被执行的代码
# 试图将会被调用,或者后面的中间件被执行
print('试图调用前的执行代码2')
response = self.get_response(request)
print('视图调用后的执行代码2')
return response
如果两个中间件的注册顺序为我们写的顺序,先函数,后类那么刷新网页后,终端会显示,注意观察中间件功能运行的顺序
一次性设置的代码2
一次性设置的代码1
视图调用前(请求之前)的代码1
试图调用前的执行代码2
视图调用后的执行代码2
视图调用后(响应之后)的代码1
中间件的结构
上下文处理器
上下文即视图函数中渲染模板使用的参数context
上下文处理器其实也就是一个函数
- 在app文件夹下建立customer_context_processors.py
# 上下文处理器,就是一个python的函数
def my_processor(request):
return {'name':'xxl'}
- 在settings.py中进行注册
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',
'teacher.customer_context_processors.my_processor'
],
},
},
]
这样模板中使用{{ name }}变量就可以不用context传递,其值为字典的值,由于默认的context上下文处理器是先注册的,所以context传递的会覆盖自己写的
Django-admin
Django内置的后台管理系统
- 在settings.py中注册和设置各种组件,默认已经会设置好
做操作后需要进行数据库迁移 - 在终端的根目录下输入命令:
python manage.py createsuperuser
Username (leave blank to use 'ubuntu'): 输入用户名
Emailaddress: admin@example.com
Password:输入密码
Password (again):再次输入密码
- 在settings.py中将LANGUAGE_CODE = ‘en-us’,改为’zh-hans’
- 进行模型(数据库)的快捷管理,需要注册,在app文件夹下的admin.py
from django.contrib import admin
from .models import 模型
admin.site.register(模型)
- 自定义设置改变页面显示,在admin.py中
class StudentAdmin(admin.ModelAdmin):
#数据列表的设置
#展示字段
list_display = ['id','name','sex','qq','phone']
#通过哪个字段跳转到编辑页面
list_display_links = ['name']
#设置搜索功能,可以搜索的字段
search_fields=['name','qq','phone']
#设置过滤功能,可以过滤的字段
list_filter=['sex','c_time']
#每页显示多少个
list_per_page = 10
#详情页的设置
#可以编辑的字段
#fields = ['name','qq']
#或者使用下面的(只能选择一个)
fieldsets= [
(None,{'fields':['name','sex']}),
('详细信息',{'fields':['qq','phone','grade']}),
('设置',{'fields':['is_deleted']})
]