1. 程式人生 > >python的Web框架,中間件middleware及djangoAdmin

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

create self name djang data- 獲取 管理表 type -c

簡介

用於處理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: [email protected]
>>>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