中間件的引入:
Django中間件(Middleware)
是一個輕量級枪芒、底層的“插件”系統(tǒng)拼窥,可以介入Django的請求和響應處理過程祠饺,修改Django的輸入或輸出.
django中的中間件:
django 中的中間件(middleware)鳄橘,在django中,中間件其實就是一個類宾娜,在請求到來和結(jié)束后,django會根據(jù)自己的規(guī)則在合適的時機執(zhí)行中間件中相應的方法扇售。
在django項目的settings模塊中前塔,有一個 MIDDLEWARE_CLASSES 變量,其中每一個元素就是一個中間件.
中間的執(zhí)行順序:
請求以自上而下的順序通過所有的層承冰,view函數(shù)處理之后华弓,響應以自下而上的順序通過所有的層,期間經(jīng)過的每個中間件都會對請求或者響應進行處理
中間件的結(jié)構(gòu):
中間件中可以定義5個方法困乒,分別是:
process_request(self,request) :
執(zhí)行視圖之前被調(diào)用寂屏,在每個請求上調(diào)用,返回None或HttpResponse對象
process_view(self, request, callback, callback_args, callback_kwargs):
調(diào)用視圖之前被調(diào)用娜搂,在每個請求上調(diào)用迁霎,返回None或HttpResponse對象
process_template_response(self,request,response):
在視圖剛好執(zhí)行完畢之后被調(diào)用,在每個請求上調(diào)用百宇,返回實現(xiàn)了render方法的響應對象
process_exception(self, request, exception)
當視圖拋出異常時調(diào)用考廉,在每個請求上調(diào)用,返回一個HttpResponse對象
process_response(self, request, response)
所有響應返回瀏覽器之前被調(diào)用携御,在每個請求上調(diào)用昌粤,返回HttpResponse對象
自定義中間件第一種方式例子:
1既绕、在主目錄下創(chuàng)建了一個e.py的文件.
2、在.py的文件中創(chuàng)建一個MyException的類
3婚苹、自定義時你想要加在哪一塊加功能就定義相對于的方法,不用全部都定義.
from django.utils.deprecation import MiddlewareMixin
class MyException(MiddlewareMixin):
def process_request(self,request):
print('自定義的process_request')
return None
def process_view(self, request, callback, callback_args, callback_kwargs):
print('自定義的process_request')
return None
def process_template_response(self,request,response):
print('自定義的process_request')
return None
def process_exception(self, request, exception):
print('自定義的process_request')
return None
def process_response(self, request, response):
print('自定義的process_request')
return None
自定義中間件第二種方式例子:
1岸更、在.py的文件中創(chuàng)建一個UserMiddleware的類
2、這個例子是給request請求增加一個myuser的屬性.
3膊升、以這一句為分界,分別在view之前執(zhí)行和view之后執(zhí)行
from student.models import UserModesl
class UserMiddle(object):
def __init__(self,get_response):
self.get_response = get_response
def __call__(self,request):
#request到達views之前的代碼
username = request.session.get('username', '未登錄')
user = Usermodel.object.filter(username=username)
if user:
setattr(request,'myuser',user.username) #增加user屬性
else:
setattr(request,'username', '未登錄')
#response到達用戶瀏覽器之前執(zhí)行的代碼
response = self.get_response(request)
return response
注冊中間件:
將類MyException和UserMiddleware注冊到settings.py中間件中:
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',
'mysite.mymiddleware.MyException',
'mysite.mymiddleware.UserMiddleware',
]
mysite是項目名,先找到文件所在的位置,把自定義的中間件的類添加到MIDLEWARE的列表當中.
上下文處理器是個什么東西呢?
上下文處理器的引入:
在settings.py中怎炊,包含了當前使用的上下文處理器。他的作用是可以給每一個模板都提供相同的變量
在模板中想要使用的變量是從視圖函數(shù)中的context這個上下文的參數(shù)中傳遞進來的,每個視圖函數(shù)需要什么參數(shù)就傳什么參數(shù).
上下文處理器就是創(chuàng)建模板變量.
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',
],
},
},
]
自定義上下文處理器例子:
在剛才的中間件的例子中,我們給request 增加了一個myuser的屬性,而如果每個模板中也就是每個頁面上都需要用到登錄用戶名這個變量名的話, 那么我們也可以把這個變量在上下文處理器中將變量傳給模板.
1廓译、在主目錄下創(chuàng)建了一個.py的文件.
2评肆、在.py的文件中創(chuàng)建一個myuser的函數(shù)
3、必須傳入request這個參數(shù)
4非区、必須返回一個字典類型的對象.
from student.models import UserModesl
def myuse(request):
username = request.session.get('username', '未登錄')
user = Usermodel.object.filter(username=username)
if user:
return {'username':username}
else:
return {}
注冊上下文處理器:
同注冊中間件相同瓜挽。先找到文件所在的位置,把自定義的上下文處理器的函數(shù)添加到TEMPLATES->OPTIONS->context_processors中。
中間件和上下文的總結(jié):
我們剛才分別用中間件和上下文完成了跟登錄用戶有關的例子, 最后的結(jié)果都是能在頁面上顯示用戶的用戶名了.
中間件是在用戶請求到響應的過程中去加入一些額外的邏輯功能,
例子中給request增加了一個myuser的屬性.
上下文是給所有的模板增加變量
例子中給模板增加了一個myuser的變量.
admin后臺的引入:
在項目的目錄下我們會看到這樣一個url的配置,你有自己去訪問這個url地址嗎??
訪問之后發(fā)現(xiàn)了什么呢???
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),#admin后臺登陸地址
path('blog/',include('blog.urls')),
path('student/',include('student.urls')),
path('teacher/',include('teacher.urls')),
path('music/',include('music.urls')),
path('gettest/',include('gettest.urls'))
]
輸入127.0.0.1:8000/admin之后征绸,你會看到出來這樣一個界面,讓你輸入用戶名和密碼去登錄?那么用戶名和密碼從哪里來,登錄之后又是什么樣的呢?
介紹 Django 管理頁面:
為你的員工或客戶生成一個用戶添加久橙,修改和刪除內(nèi)容的后臺是一項缺乏創(chuàng)造性和乏味的工作。因此管怠,Django 全自動地根據(jù)模型創(chuàng)建后臺界面淆衷。
Django 產(chǎn)生于一個公眾頁面和內(nèi)容發(fā)布者頁面完全分離的新聞類站點的開發(fā)過程中。站點管理人員使用管理系統(tǒng)來添加新聞渤弛、事件和體育時訊等祝拯,這些添加的內(nèi)容被顯示在公眾頁面上。Django 通過為站點管理人員創(chuàng)建統(tǒng)一的內(nèi)容編輯界面解決了這個問題她肯。
管理界面不是為了網(wǎng)站的訪問者佳头,而是為管理者準備的。
運行命令,創(chuàng)建一個管理員賬號:
python manage.py createsuperuser
按提示輸入用戶名晴氨、郵箱康嘉、密碼
用創(chuàng)建的用戶登錄
管理界面本地化:
編輯settings.py文件,設置編碼籽前、時區(qū)
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False
向admin中注冊模型:
將之前在表關系中那幾個模型類創(chuàng)建在現(xiàn)在的app的models.py中.
將模型類執(zhí)行映射在數(shù)據(jù)庫中生成表.
在app里面有個admin.py的文件,在這個文件中注冊模型.
from .models import Student,Stu_detail,Dpartment,Course
admin.site.register(Student)
admin.site.register(Stu_detail)
admin.site.register(Dpartment)
admin.site.register(Course)
admin后臺頁面顯示:
將模型類再admin.py中注冊過后
刷新管理頁面,對數(shù)據(jù)表中數(shù)據(jù)進行增刪改查操作
admin后臺操作:
對數(shù)據(jù)表中數(shù)據(jù)進行增刪改查操作,
下圖是增加學生信息表中的數(shù)據(jù)
自定義管理頁面:
Django提供了admin.ModelAdmin類
通過定義ModelAdmin的子類凄鼻,來定義模型在Admin界面的顯示方式
列表頁屬性
list_display:顯示字段,可以點擊列頭進行排序
list_filter:過濾字段聚假,過濾框會出現(xiàn)在右側(cè)
search_fields:搜索字段块蚌,搜索框會出現(xiàn)在上側(cè)
list_per_page:分頁,分頁框會出現(xiàn)在下側(cè)
添加膘格、修改頁屬性
fields:屬性的先后順
fieldsets:屬性分組
注意:上面兩個屬性峭范,二者選一。
自定義管理頁面例子:
創(chuàng)建模型類對應的管理頁面admin的類
將自定義的類放到register方法中注冊使用
from .models import Student,Stu_detail,Dpartment,Course
class DepartmentAdmin(admin.ModelAdmin):
list_display = ['d_id','d_name']#以兩列顯示
list_display_link = ['d_id','d_name']#可以鏈接到具體內(nèi)容
list_filter = ['d_id']#以此查找
admin.site.register(Student)
admin.site.register(Stu_detail)
admin.site.register(Dpartment)
admin.site.register(Course)