python的Web框架,中間件middleware及djangoAdmin
阿新 • • 發佈:2019-03-21
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