首页 > 编程语言 > 详细

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

时间:2019-03-21 11:54:23      阅读:292      评论:0      收藏:0      [点我收藏+]

简介

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

 

显示列表的设置

技术分享图片

 

详情页的分组展示:

技术分享图片

 

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

原文:https://www.cnblogs.com/hua888/p/10570262.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!