Django-中间件、上下文处理器和Djangoadmin

18中间件、上下文处理器和Djangoadmin

中间件的引入

在这里插入图片描述

  1. 在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

  1. 在项目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
上下文处理器其实也就是一个函数

  1. 在app文件夹下建立customer_context_processors.py

# 上下文处理器,就是一个python的函数

def my_processor(request):
    return {'name':'xxl'}
  1. 在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内置的后台管理系统

  1. 在settings.py中注册和设置各种组件,默认已经会设置好
    做操作后需要进行数据库迁移
  2. 在终端的根目录下输入命令:
python manage.py createsuperuser
Username (leave blank to use 'ubuntu'): 输入用户名
Emailaddress: admin@example.com
Password:输入密码
Password (again):再次输入密码
  1. 在settings.py中将LANGUAGE_CODE = ‘en-us’,改为’zh-hans’
  2. 进行模型(数据库)的快捷管理,需要注册,在app文件夹下的admin.py
from django.contrib import admin
from .models import 模型
admin.site.register(模型)
  1. 自定义设置改变页面显示,在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']})
	]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值