• python的Web框架,中间件middleware及djangoAdmin


    简介

    用于处理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)

    显示列表的设置

    详情页的分组展示:

  • 相关阅读:
    转:每个架构师都应该研究下康威定律
    使用OpenShiftFQ上外网
    关系模式设计
    数据库应用系统工程过程
    数据库系统
    四种常见 Git 工作流比较
    Git 进阶指南
    C#高性能TCP服务的多种实现方式
    浮动广告
    <span></span>
  • 原文地址:https://www.cnblogs.com/hua888/p/10570262.html
Copyright © 2020-2023  润新知