Django中間件和上下文處理器

中間件的引入:
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)
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瘪贱,一起剝皮案震驚了整個濱河市纱控,隨后出現(xiàn)的幾起案子辆毡,更是在濱河造成了極大的恐慌,老刑警劉巖甜害,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舶掖,死亡現(xiàn)場離奇詭異,居然都是意外死亡尔店,警方通過查閱死者的電腦和手機眨攘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嚣州,“玉大人鲫售,你說我怎么就攤上這事「秒龋” “怎么了情竹?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長匀哄。 經(jīng)常有香客問我秦效,道長,這世上最難降的妖魔是什么涎嚼? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任阱州,我火速辦了婚禮,結(jié)果婚禮上铸抑,老公的妹妹穿的比我還像新娘贡耽。我一直安慰自己衷模,他們只是感情好鹊汛,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著阱冶,像睡著了一般刁憋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上木蹬,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天至耻,我揣著相機與錄音,去河邊找鬼镊叁。 笑死尘颓,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的晦譬。 我是一名探鬼主播疤苹,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼敛腌!你這毒婦竟也來了卧土?” 一聲冷哼從身側(cè)響起惫皱,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎尤莺,沒想到半個月后旅敷,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡颤霎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年媳谁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捷绑。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡韩脑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出粹污,到底是詐尸還是另有隱情段多,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布壮吩,位于F島的核電站进苍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鸭叙。R本人自食惡果不足惜觉啊,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沈贝。 院中可真熱鬧杠人,春花似錦、人聲如沸宋下。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽学歧。三九已至罩引,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間枝笨,已是汗流浹背袁铐。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留横浑,地道東北人剔桨。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像徙融,于是被迫代替她去往敵國和親洒缀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容