十一 Django-視圖

一巫糙、概要

視圖可以一個python函數(shù),可以叫視圖函數(shù)颊乘,或者簡稱視圖参淹,也可以是是一個類,定義在views.py 文件中乏悄。
主要用于接收并處理請求浙值,調(diào)用模型層和模板層,響應(yīng)請求(返回HttpResponse或其子類)每一個用戶請求纲爸,都對應(yīng)著一個視圖(和url地址)亥鸠,由視圖處理請求后,再返回html頁面內(nèi)容給瀏覽器顯示识啦。在http請求中產(chǎn)生兩個核心對象,所在位置是神妹,django.http

二颓哮、核心對象

  1. http請求:HttpRequest對象
  2. http響應(yīng):HttpResponse對象

三、HttpRequest對象

1鸵荠、說明

當(dāng)請求一個頁面時冕茅,Django 創(chuàng)建一個 HttpRequest對象包含原數(shù)據(jù)的請求。然后 Django 加載適當(dāng)?shù)囊晥D蛹找,通過 HttpRequest作為視圖函數(shù)的第一個參數(shù)姨伤。每個視圖負責(zé)返回一個HttpResponse目標(biāo)

2、屬性

2.1庸疾、GET

  1. 說明
    一個類似于字典的對象乍楚,如果請求中包含表單數(shù)據(jù),則將這些數(shù)據(jù)封裝成 QueryDict 對象
  2. 舉個栗子
    value = request.GET.get('key',default=None)
    

2.2届慈、POST

  1. 說明
    一個類似于字典的對象徒溪,如果請求中包含表單數(shù)據(jù)忿偷,則將這些數(shù)據(jù)封裝成 QueryDict 對象。
  2. 栗子
    value = request.POST.get('key',default=None)
    

2.3臊泌、path

  1. 說明
    請求頁面的全路徑鲤桥,不包括域名和參數(shù)
  2. 栗子
    /index/
    /shop/list/
    

2.4、method

  1. 說明
    請求中使用的HTTP方法的字符串表示渠概。全大寫表示
  2. 示例
    if request.method=='GET':
       #這里是get請求
    elif request.method ='POST':
       #這里是post請求
    

2.5茶凳、COOKIES

  1. 說明
    包含所有cookies的標(biāo)準Python字典對象;keys和values都是字符串播揪。
  2. 示例代碼
    查看會話機制專題
    

2.6贮喧、session

  1. 說明
    唯一可讀寫的屬性,代表當(dāng)前會話的字典對象剪芍;自己有激活Django中的session支持時該屬性才可用塞淹。
  2. 栗子
    查看會話機制專題
    

2.7、FILES

  1. 說明
    包含所有上傳文件的類字典對象罪裹;
    FILES中的每一個Key都是'<input type="file" name="" />'標(biāo)簽中 name屬性的值饱普,F(xiàn)ILES中的每一個value同時也是一個標(biāo)準的python字典對象
    注意,F(xiàn)ILES 只有在請求的方法為POST 且提交的<form>帶有enctype="multipart/form-data" 的情況下才會包含數(shù)據(jù)状共。否則套耕,F(xiàn)ILES 將為一個空的類似于字典的對象
  2. 栗子
    查看文件上傳相關(guān)
    

2.8、user

  1. 說明
    一個 AUTH_USER_MODEL 類型的對象峡继,表示當(dāng)前登錄的用戶冯袍。
    如果用戶當(dāng)前沒有登錄,user 將設(shè)置為 django.contrib.auth.models.AnonymousUser 的一個實例碾牌。你可以通過 is_authenticated()
  2. 栗子
    具體查看用戶認證
    if request.user.is_authenticated():
     # Do something for logged-in users.
    else:
     # Do something for anonymous users.
    

2.9康愤、encoding

  1. 說明
    一個字符串,表示提交的數(shù)據(jù)的編碼方式(如果為 None 則表示使用 DEFAULT_CHARSET 的設(shè)置舶吗,默認為 'utf-8')征冷。這個屬性是可寫的,你可以修改它來修改訪問表單數(shù)據(jù)使用的編碼誓琼。
    接下來對屬性的任何訪問(例如從 GET 或 POST 中讀取數(shù)據(jù))將使用新的 encoding 值检激。
    如果你知道表單數(shù)據(jù)的編碼不是 DEFAULT_CHARSET ,則使用它腹侣。

2.10叔收、META

  1. 說明

一個標(biāo)準的Python字典包含所有可用的HTTP頭“亮ィ可用標(biāo)題取決于客戶端和服務(wù)器

  1. 栗子
    • CONTENT_LENGTH
      請求體的長度(一個字符串)饺律。
    • CONTENT_TYPE
      請求體的類型。
    • HTTP_ACCEPT
      為響應(yīng)–可以接受的內(nèi)容類型伦籍。
    • HTTP_ACCEPT_ENCODING
      接受編碼的響應(yīng)
    • HTTP_ACCEPT_LANGUAGE
      接受語言的反應(yīng)
    • HTTP_HOST
      客戶端發(fā)送的HTTP主機頭蓝晒。
    • HTTP_REFERER
      參考頁面
    • HTTP_USER_AGENT
      客戶端的用戶代理字符串腮出。
    • QUERY_STRING
      查詢字符串,作為一個單一的(分析的)字符串芝薇。
    • REMOTE_ADDR
      客戶端的IP地址
    • REMOTE_HOST
      客戶端的主機名
    • REMOTE_USER
      用戶通過Web服務(wù)器的身份驗證
    • REQUEST_METHOD
      字符串胚嘲,如"GET"或"POST"
    • SERVER_NAME
      服務(wù)器的主機名
    • SERVER_PORT
      服務(wù)器的端口(一個字符串)

3、方法

3.1洛二、get_host()

  1. 說明
    根據(jù)從HTTP_X_FORWARDED_HOST(如果打開 USE_X_FORWARDED_HOST馋劈,默認為False)和 HTTP_HOST 頭部信息返回請求的原始主機。
    注意:當(dāng)主機位于多個代理后面時晾嘶,get_host() 方法將會失敗妓雾。除非使用中間件重寫代理的首部。
  2. 栗子
    # 假如要訪問的地址是
    http://127.0.0.1:8000/user/login/
    

3.2垒迂、get_full_path()

  1. 說明
     返回 path械姻,如果可以將加上查詢字符串。
  2. 舉個栗子
    # 完整的請求地址 http://127.0.0.1:8000/user/list/?page=1&size=10
    print(request.get_full_path())
    # 輸出 /user/list/?page=1&size=10
    

3.3机断、is_secure()

  1. 說明
    如果請求時是安全的楷拳,則返回True;即請求通是過 HTTPS 發(fā)起的吏奸。

3.4欢揖、is_ajax()

  1. 說明
    判斷是否是ajax請求

四、HttpResponse對象

1奋蔚、說明

對于HttpRequest對象來說她混,是由django自動創(chuàng)建的,但是泊碑,HttpResponse對象就必須我們自己創(chuàng)建坤按。每個view請求處理方法必須返回一個HttpResponse對象

2、主要的屬性

  • content:表示返回的內(nèi)容馒过,字符串類型
  • charset:表示response采用的編碼字符集晋涣,字符串類型
  • status_code:響應(yīng)的HTTP響應(yīng)狀態(tài)碼,默認是200
  • content-type:指定輸出的MIME類型

3沉桌、主要的方法

  • init
    使用頁內(nèi)容實例化HttpResponse對象
  • write(content)
    以文件的方式寫
  • flush():
    以文件的方式輸出緩存區(qū)
  • set_cookie
    設(shè)置Cookie,具體的使用看會話章節(jié)

4算吩、HttpResponse的常見的子類

4.1留凭、JsonResponse

  1. 說明
    這個類是HttpRespon的子類,返回json類型的數(shù)據(jù)偎巢,它的默認Content-Type 被設(shè)置為: application/json
  2. 構(gòu)造方法
    JsonResponse(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None,**kwargs)
    
  3. 參數(shù)說明
    • data
      一個字典類型的數(shù)據(jù)
    • encoder
      json生成器
    • safe
      默認的safe 參數(shù)是 True. 如果你傳入的data數(shù)據(jù)類型不是字典類型蔼夜,那么它就會拋出 TypeError的異常,如果設(shè)置為False ,那data可以填入任何能被轉(zhuǎn)換為JSON格式的對象压昼,比如list, tuple, set求冷。
    • json_dumps_params
      一個字典,它將調(diào)用json.dumps()方法并將字典中的參數(shù)傳入給該方法
  4. 示例代碼
    # 使用HttpResponse
    def index(request):
        data={
            'name':'hello',
            'age':18,
        }
        return HttpResponse(json.dumps(data),content_type="application/json")
    # 使用JsonResponse 直接將字典傳遞過去
    def index(request):
        data={
            'name':'hello',
            'age':18,
        }
        return JsonResponse(data)
    
    # 如果返回的是 list類型
    def index(request):
        data=[1,2,3,4,5]
        return JsonResponse(data,safe=False)
    '''
    注意: 如果不設(shè)置safe=False 將會拋出
    TypeError錯誤
    '''
    

4.2瘤运、TemplateResponse

  1. 說明
    SimpleTemplateResponse的子類,而SimpleTemplateResponse又繼承自HttpResponse
    主要的作用是將模板渲染成HTML字符串返回給客服端,具體看快捷方法中的render函數(shù)

4.3匠题、HttpResponseRedirect

  1. 說明
    重定向拯坟,服務(wù)器端跳轉(zhuǎn)
    具體看細節(jié)看重定向章節(jié)

五、快捷方法

1韭山、說明

  • 頁面渲染:render(推薦)郁季,render_to_response,
  • 頁面跳轉(zhuǎn):redirect
  • locals: 可以直接將對應(yīng)視圖函數(shù)中所有的變量傳給模板

2、render

  1. 方法
    render(request, template_name, context=None, content_type=None, status=None,using=None)
    
  2. 參數(shù)說明
    • request
      請求
    • template_name(必選)
      一個模板的使用或模板序列名稱全稱钱磅。如果序列是給定的梦裂,存在于第一個模板將被使用
    • context(可選)
      一組字典的值添加到模板中。默認情況下盖淡,這是一個空的字典年柠。
    • content_type(可選)
      MIME類型用于生成文檔。
    • status (可選)
      為響應(yīng)狀態(tài)代碼褪迟。默認值為200
    • using
      用于加載模板使用的模板引擎的NAME冗恨。
  3. 示例代碼
    # 純靜態(tài)界面渲染
    def index(request):
        return render(request,'index.html')   #向用戶顯示一個html頁面
    
    # 配合傳遞數(shù)據(jù)配合模板語法使用
    def index(request):
     data={'user':{'name':'小明',age:18}}
        return render(request,'index.html',context=data)   #向用戶顯示一個html頁面
    
    # 也可以使用簡寫方式 locals()函數(shù),他會將視圖函數(shù)中的所有局部變量封裝到字典中
    # 主要在開發(fā)中盡量不要使用,尤其數(shù)據(jù)比較復(fù)雜的時候,因為有可能有的數(shù)據(jù)不一定會使用
    # 所以當(dāng)你確定你的視圖函數(shù)中的定義的所有變量都要傳遞給視圖的時候,你可以使用這個函數(shù)
    def index(request):
     user = {'name':'小明',age:18}
        # 生成的數(shù)據(jù)context = {'user': user}
        return render(request,'index.html',locals())   #向用戶顯示一個html頁面
    

3、redirect 函數(shù)

  1. 說明
    具體查看重定向章節(jié)

六牵咙、FBV與CBV

  1. 說明
    FBV派近、CBV是Django視圖路由處理模型,當(dāng)用戶請求送達路由系統(tǒng)URL后洁桌,由其轉(zhuǎn)發(fā)給視圖view來分析并處理
    CBV全稱是class base views渴丸,中文名字類通用視圖
    FBV全稱是function base views,中文名字視圖函數(shù)
  2. FBV實例
    #urls.py
    from django.conf.urls import url, include
    urlpatterns = [
        url(r‘^index/‘, views.index),
    ]
    
    #views.py
    from django.shortcuts import render
    def index(request):
        if request.method == ‘POST‘:
            print(‘method is :‘ + request.method)
        elif request.method == ‘GET‘:
            print(‘method is :‘ + request.method)
        return render(req, ‘index.html‘)
    
    #index.html
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>index</title>
    </head>
    <body>
        <form action="" method="post">
            <input type="text" name="A" />
            <input type="submit" name="b" value="提交" />
        </form>
    </body>
    </html>
    
  3. CBV實例
    from mytest import views
    urlpatterns = [
        # url(r‘^index/‘, views.index),
        url(r‘^index/‘, views.Index.as_view()),
        #注:url(r‘^index/‘, views.Index.as_view()),  是固定用法
    ]
    
    #views
    from django.views import View
    class Index(View):
        def get(self, request):
            print(‘method is :‘ + request.method)
            return render(request, ‘index.html‘)
        def post(self, request):
            print(‘method is :‘ + request.method)
            return render(request, ‘index.html‘)
    
    <!--index.html -->
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>index</title>
    </head>
    <body>
        <form action="" method="post">
            <input type="text" name="A" />
            <input type="submit" name="b" value="提交" />
        </form>
    </body>
    </html>
    
    ?
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末另凌,一起剝皮案震驚了整個濱河市谱轨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吠谢,老刑警劉巖土童,帶你破解...
    沈念sama閱讀 222,946評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異工坊,居然都是意外死亡献汗,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評論 3 399
  • 文/潘曉璐 我一進店門王污,熙熙樓的掌柜王于貴愁眉苦臉地迎上來罢吃,“玉大人,你說我怎么就攤上這事昭齐∧蛘校” “怎么了?”我有些...
    開封第一講書人閱讀 169,716評論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長就谜。 經(jīng)常有香客問我怪蔑,道長,這世上最難降的妖魔是什么丧荐? 我笑而不...
    開封第一講書人閱讀 60,222評論 1 300
  • 正文 為了忘掉前任缆瓣,我火速辦了婚禮,結(jié)果婚禮上篮奄,老公的妹妹穿的比我還像新娘捆愁。我一直安慰自己,他們只是感情好窟却,可當(dāng)我...
    茶點故事閱讀 69,223評論 6 398
  • 文/花漫 我一把揭開白布昼丑。 她就那樣靜靜地躺著,像睡著了一般夸赫。 火紅的嫁衣襯著肌膚如雪菩帝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,807評論 1 314
  • 那天茬腿,我揣著相機與錄音呼奢,去河邊找鬼。 笑死切平,一個胖子當(dāng)著我的面吹牛握础,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悴品,決...
    沈念sama閱讀 41,235評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼禀综,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了苔严?” 一聲冷哼從身側(cè)響起定枷,我...
    開封第一講書人閱讀 40,189評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎届氢,沒想到半個月后欠窒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,712評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡退子,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,775評論 3 343
  • 正文 我和宋清朗相戀三年岖妄,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寂祥。...
    茶點故事閱讀 40,926評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡衣吠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出壤靶,到底是詐尸還是另有隱情,我是刑警寧澤惊搏,帶...
    沈念sama閱讀 36,580評論 5 351
  • 正文 年R本政府宣布贮乳,位于F島的核電站忧换,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏向拆。R本人自食惡果不足惜亚茬,卻給世界環(huán)境...
    茶點故事閱讀 42,259評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望浓恳。 院中可真熱鬧刹缝,春花似錦、人聲如沸颈将。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晴圾。三九已至颂砸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間死姚,已是汗流浹背人乓。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留都毒,地道東北人色罚。 一個月前我還...
    沈念sama閱讀 49,368評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像账劲,于是被迫代替她去往敵國和親戳护。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,930評論 2 361

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