简介
用于处理request和response的中间处理的函数,可以创建在项目中的任意位置,只要可以导入即可。
建议创建在APP目录下,方便管理。
函数范式与激活
1 中间件的范式: 2 3 # 必须接受get_response这个餐参数 4 def simple_middleware(get_response): #中间件工厂 5 6 # 此处为一次性的设置和初始化,在start project的时候。 7 8 def middleware(request): 9 10 # 处理请求之前被执行的代码。 11 # 视图将会被调用,或者后面的中间件会执行。 12 13 response = get_response(request) # 必写 14 15 # 处理请求,响应之后的代码。 16 # 视图已经被调用。 17 18 return response 19 20 return middleware
注册激活中间件
1 在settings中找到MIDDLEWARE,添加中间件的导入全路径 2 3 MIDDLEWARE = [ 4 'django.middleware.security.SecurityMiddleware', 5 'django.contrib.sessions.middleware.SessionMiddleware', 6 'django.middleware.common.CommonMiddleware', 7 'django.middleware.csrf.CsrfViewMiddleware', 8 'django.contrib.auth.middleware.AuthenticationMiddleware', 9 'django.contrib.messages.middleware.MessageMiddleware', 10 'django.middleware.clickjacking.XFrameOptionsMiddleware', 11 12 # 激活 13 'teacher.middleware.simple_middleware', 14 ] 15 16 解析: 17 请求从上往下执行, 18 响应从下往上返回, 19 20 当在某一层有响应返回后,就不在往下执行了,就会返回响应回去。 21 22 23 中间件的运行流程 24 25 当有多个中间件的时候,在调用的注册后,中间件中在执行到'response = get_response(request)'之前, 26 不会马上的处理视图,而是会执行到下一个中间件的'response = get_response(request) '前面。
看到了使用方法,我们来写一个简单的例子。类似反爬虫
1 from django. 2 3 def simple_middleware(get_response): 4 5 def middleware(request): 6 7 # 获取当前访问的user-agent 8 user_agent = request.META['HTTP_USER_AGENT'] 9 if not 'chrome' in user_agent.lower(): 10 return HttpResponseForbidden() 11 12 response = get_response(request) 13 14 return response 15 16 return middleware
类的范式
1 class SimpleMiddleWare: 2 3 # 和函数一样,必须有一个get_response 4 def __init__(self, get_response): 5 self.get_response = get_response 6 # 此处为一次性的设置和初始化,在start projec的时候。 7 8 9 # 因为需要被调用,所以需要有一个call方法 10 def __call__(self, request): 11 12 # 处理请求之前被执行的代码。 13 # 视图将会被调用,或者后面的中间件会执行。 14 15 response = self.get_response(request) 16 17 # 处理请求,响应之后的代码。 18 # 视图已经被调用。 19 20 return response 21
中间件中可以定义的方法,分别是:
process_view(self, request, callback, callback_args, callback_kwargs): # 调用视图之前被调用,在每个请求上调用,返回None或HttpResponse对象 process_template_response(self,request,response): # 在视图刚好执行完毕之后被调用,在每个请求上调用,返回实现了render方法的响应对象 process_exception(self, request, exception) # 当视图抛出异常时调用,在每个请求上调用,返回一个HttpResponse对象
上下文处理器
可以创建在项目中的任意位置,和context类似的使用,但是这个定义的是全局变量,可以所有的html应用
在APP下创建一个customer_context_processors.py文件
1 范式: 2 3 # 必须接受一个request 4 def my_name(request): 5 # 必须返回一个字典 6 return {'name': 'aaa'}
在settings中激活设置
也是从上往下执行的,但是后执行的会覆盖之前执行的
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR,'template')], '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_name' ], }, }, ]
html中使用
# 使用很简单,如果是视图函数传送过来的context,则会覆盖当前name。因为view是比上下文处理器晚执行。
{{ name }}
djangoAdmin
配置
注册的admin,且admin会依赖auth,contenttpoes,sessions,messages,在创建一个项目的时候,它会自动装上。
INSTALLED_APPS = [ 'teacher.apps.TeacherConfig', 'django.contrib.admin', # 默认定义好的 'django.contrib.auth', # 需要的依赖 'django.contrib.contenttypes', # 需要的依赖 'django.contrib.sessions', # 需要的依赖 'django.contrib.messages', #需要的依赖 'django.contrib.staticfiles', ]
其中需要配置TEMPLATES的是'django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',现在是默认设置好了的
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR,'template')], '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', #默认定义好的 ], }, }, ]
MIDDLEWARE配置
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', 'teacher.middleware.simple_middleware', ]
在根路由中,配置admin,默认已经配置好了
urlpatterns = [ path('admin/', admin.site.urls), ]
至此已经配置好了,但是还需要数据库迁移后就可以了。就可以登录了,使用网址后缀为admin
注册admin账户
第一个用户需要使用命令行创建
使用'python manage.py createsuperuser'命令来创建管理员账号 >>>(django) pyvip@Vip:~/code/crm$ python manage.py createsuperuser
>>>Username (leave blank to use 'pyvip'): admin
>>>Email address: admin@examle.com
>>>Password: >>>Password (again): This password is too short. It must contain at least 8 characters. This password is too common. This password is entirely numeric. >Bypass password validation and create user anyway? [y/N]: y Superuser created successfully.
此时即可登录成功
当前显示的是英文,如需要修改为中文,在settings中设置即可
# 将en-us修改为zh-hans LANGUAGE_CODE = 'zh-hans'
当前只有用户和组,那还有需要管理表和模型,需要如何操作呢。
注册模型和form让admin去管理
在APP下的admin.py中配置
1 from django.contrib import admin 2 #导入管理的表 3 from teacher.models import Students, StudentsDetail 4 5 #注册模型 6 admin.site.register(Students) 7 admin.site.register(StudentsDetail)
现在就出现了我们需要的表 :
自定义显示方法,默认显示的是对象方式的。
如果需要显示我们需要的字段,则需要如下写法
class StudentsAdmin(admin.ModelAdmin): 显示列表的设置 # 显示的字段 list_display = ['id', 'name', 'sex', 'age', 'qq', 'phone','c_time'] # 可以点击的字段,如果不设置,默认是id可以被点击 list_display_links = ['name'] # 定义可搜索的字段 search_fields = ['name', 'qq', 'phone', 'c_time'] # 过滤器 list_filter = ['sex', 'c_time'] # 每页显示的条数 list_per_page = 3 详情页,添加液的设置 fields = ['name', 'qq'] 分组展示 fieldsets = [ ('学生信息', {'fields':['name', 'sex']}), ('详细信息', {'fields':['qq', 'phone']}), ('设置', {'fields':['is_deleted']}), ] fields和fieldsets只能二选一 # 在创建了类之后,需要把类和模型一起注册,才可以生效,需要写在类的下面。 admin.site.register(Students, StudentsAdmin)
显示列表的设置
详情页的分组展示: