日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Djang视图层

發(fā)布時(shí)間:2025/3/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Djang视图层 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

視圖

1.什么是視圖

  視圖就是Django項(xiàng)目下的view.py,它的內(nèi)部是一系列的函數(shù)或者是類,用來(lái)專門處理客戶端訪問(wèn)請(qǐng)求并且返回相應(yīng)的數(shù)據(jù),相當(dāng)于一個(gè)中央處理系統(tǒng)。

2.具體視圖實(shí)例

3.CBV和FBV

  視圖文件除了上面的用一系列的函數(shù)來(lái)對(duì)應(yīng)處理客戶端請(qǐng)求的數(shù)據(jù)邏輯外,還可以通過(guò)定義類來(lái)處理相應(yīng)的邏輯,首先第一步

要想真正的讓CBV的方式湊效,光在視圖文件中改動(dòng)是不夠的

?所以才CBV模式下,無(wú)名可以自定義dispatch方法,來(lái)控制之下真正的方法之前之后的一些行為,達(dá)到裝飾器的效果!

Request對(duì)象和Response對(duì)象

request對(duì)象

  當(dāng)一個(gè)頁(yè)數(shù)據(jù)被請(qǐng)求時(shí),Django就會(huì)將請(qǐng)求的所有數(shù)據(jù)自動(dòng)傳遞給約定俗稱的request這個(gè)參數(shù),而我們只需要拿到這個(gè)參數(shù)并對(duì)其進(jìn)行一系列的操作即可獲得所有與操作有關(guān)的數(shù)據(jù)

1.操作request對(duì)象的相應(yīng)方法
  • path_info  ? ?返回用戶訪問(wèn)url,不包括域名
  • method  ?? 請(qǐng)求中使用的HTTP方法的字符串表示,全大寫表示
  • GET? ? ? ? ? ? ?? 包含所有HTTP GET參數(shù)的類字典對(duì)象
  • POST? ? ? ? ? ? ?包含所有HTTP POST參數(shù)的類字典對(duì)象
  • body? ? ? ? ? ? ? ?請(qǐng)求體,byte類型request.POST的數(shù)據(jù)就是從body里面提取到的

屬性
屬性:django將請(qǐng)求報(bào)文中的請(qǐng)求行、頭部信息、內(nèi)容主體封裝成 HttpRequest 類中的屬性。除了特殊說(shuō)明的之外,其他均為只讀的。0.HttpRequest.scheme表示請(qǐng)求方案的字符串(通常為http或https)1.HttpRequest.body一個(gè)字符串,代表請(qǐng)求報(bào)文的主體。在處理非 HTTP 形式的報(bào)文時(shí)非常有用,例如:二進(jìn)制圖片、XML,Json等。但是,如果要處理表單數(shù)據(jù)的時(shí)候,推薦還是使用 HttpRequest.POST 。另外,我們還可以用 python 的類文件方法去操作它,詳情參考 HttpRequest.read() 。2.HttpRequest.path一個(gè)字符串,表示請(qǐng)求的路徑組件(不含域名)。例如:"/music/bands/the_beatles/"3.HttpRequest.method一個(gè)字符串,表示請(qǐng)求使用的HTTP 方法。必須使用大寫。例如:"GET""POST"4.HttpRequest.encoding一個(gè)字符串,表示提交的數(shù)據(jù)的編碼方式(如果為 None 則表示使用 DEFAULT_CHARSET 的設(shè)置,默認(rèn)為 'utf-8')。這個(gè)屬性是可寫的,你可以修改它來(lái)修改訪問(wèn)表單數(shù)據(jù)使用的編碼。接下來(lái)對(duì)屬性的任何訪問(wèn)(例如從 GET 或 POST 中讀取數(shù)據(jù))將使用新的 encoding 值。如果你知道表單數(shù)據(jù)的編碼不是 DEFAULT_CHARSET ,則使用它。5.HttpRequest.GET 一個(gè)類似于字典的對(duì)象,包含 HTTP GET 的所有參數(shù)。詳情請(qǐng)參考 QueryDict 對(duì)象。6.HttpRequest.POST一個(gè)類似于字典的對(duì)象,如果請(qǐng)求中包含表單數(shù)據(jù),則將這些數(shù)據(jù)封裝成 QueryDict 對(duì)象。POST 請(qǐng)求可以帶有空的 POST 字典 —— 如果通過(guò) HTTP POST 方法發(fā)送一個(gè)表單,但是表單中沒(méi)有任何的數(shù)據(jù),QueryDict 對(duì)象依然會(huì)被創(chuàng)建。因此,不應(yīng)該使用 if request.POST 來(lái)檢查使用的是否是POST 方法;應(yīng)該使用 if request.method == "POST" 另外:如果使用 POST 上傳文件的話,文件信息將包含在 FILES 屬性中。7.HttpRequest.COOKIES一個(gè)標(biāo)準(zhǔn)的Python 字典,包含所有的cookie。鍵和值都為字符串。8.HttpRequest.FILES一個(gè)類似于字典的對(duì)象,包含所有的上傳文件信息。FILES 中的每個(gè)鍵為<input type="file" name="" /> 中的name,值則為對(duì)應(yīng)的數(shù)據(jù)。注意,FILES 只有在請(qǐng)求的方法為POST 且提交的<form> 帶有enctype="multipart/form-data" 的情況下才會(huì)包含數(shù)據(jù)。否則,FILES 將為一個(gè)空的類似于字典的對(duì)象。9.HttpRequest.META一個(gè)標(biāo)準(zhǔn)的Python 字典,包含所有的HTTP 首部。具體的頭部信息取決于客戶端和服務(wù)器,下面是一些示例:CONTENT_LENGTH —— 請(qǐng)求的正文的長(zhǎng)度(是一個(gè)字符串)。CONTENT_TYPE —— 請(qǐng)求的正文的MIME 類型。HTTP_ACCEPT —— 響應(yīng)可接收的Content-Type。HTTP_ACCEPT_ENCODING —— 響應(yīng)可接收的編碼。HTTP_ACCEPT_LANGUAGE —— 響應(yīng)可接收的語(yǔ)言。HTTP_HOST —— 客服端發(fā)送的HTTP Host 頭部。HTTP_REFERER —— Referring 頁(yè)面。HTTP_USER_AGENT —— 客戶端的user-agent 字符串。QUERY_STRING —— 單個(gè)字符串形式的查詢字符串(未解析過(guò)的形式)。REMOTE_ADDR —— 客戶端的IP 地址。REMOTE_HOST —— 客戶端的主機(jī)名。REMOTE_USER —— 服務(wù)器認(rèn)證后的用戶。REQUEST_METHOD —— 一個(gè)字符串,例如"GET""POST"。SERVER_NAME —— 服務(wù)器的主機(jī)名。SERVER_PORT —— 服務(wù)器的端口(是一個(gè)字符串)。從上面可以看到,除 CONTENT_LENGTH 和 CONTENT_TYPE 之外,請(qǐng)求中的任何 HTTP 首部轉(zhuǎn)換為 META 的鍵時(shí),都會(huì)將所有字母大寫并將連接符替換為下劃線最后加上 HTTP_ 前綴。所以,一個(gè)叫做 X-Bender 的頭部將轉(zhuǎn)換成 META 中的 HTTP_X_BENDER 鍵。10.HttpRequest.user一個(gè) AUTH_USER_MODEL 類型的對(duì)象,表示當(dāng)前登錄的用戶。如果用戶當(dāng)前沒(méi)有登錄,user 將設(shè)置為 django.contrib.auth.models.AnonymousUser 的一個(gè)實(shí)例。你可以通過(guò) is_authenticated() 區(qū)分它們。例如:if request.user.is_authenticated():# Do something for logged-in users.else:# Do something for anonymous users. user 只有當(dāng)Django 啟用 AuthenticationMiddleware 中間件時(shí)才可用。-------------------------------------------------------------------------------------匿名用戶class models.AnonymousUserdjango.contrib.auth.models.AnonymousUser 類實(shí)現(xiàn)了django.contrib.auth.models.User 接口,但具有下面幾個(gè)不同點(diǎn):id 永遠(yuǎn)為None。username 永遠(yuǎn)為空字符串。get_username() 永遠(yuǎn)返回空字符串。is_staff 和 is_superuser 永遠(yuǎn)為False。is_active 永遠(yuǎn)為 False。groups 和 user_permissions 永遠(yuǎn)為空。is_anonymous() 返回True 而不是False。is_authenticated() 返回False 而不是True。set_password()、check_password()、save() 和delete() 引發(fā) NotImplementedError。New in Django 1.8:新增 AnonymousUser.get_username() 以更好地模擬 django.contrib.auth.models.User。11.HttpRequest.session一個(gè)既可讀又可寫的類似于字典的對(duì)象,表示當(dāng)前的會(huì)話。只有當(dāng)Django 啟用會(huì)話的支持時(shí)才可用。完整的細(xì)節(jié)參見(jiàn)會(huì)話的文檔。 request屬性相關(guān)
上傳文件實(shí)例

方法
1.HttpRequest.get_host()根據(jù)從HTTP_X_FORWARDED_HOST(如果打開(kāi) USE_X_FORWARDED_HOST,默認(rèn)為False)和 HTTP_HOST 頭部信息返回請(qǐng)求的原始主機(jī)。如果這兩個(gè)頭部沒(méi)有提供相應(yīng)的值,則使用SERVER_NAME 和SERVER_PORT,在PEP 3333 中有詳細(xì)描述。USE_X_FORWARDED_HOST:一個(gè)布爾值,用于指定是否優(yōu)先使用 X-Forwarded-Host 首部,僅在代理設(shè)置了該首部的情況下,才可以被使用。例如:"127.0.0.1:8000"注意:當(dāng)主機(jī)位于多個(gè)代理后面時(shí),get_host() 方法將會(huì)失敗。除非使用中間件重寫代理的首部。2.HttpRequest.get_full_path()返回 path,如果可以將加上查詢字符串。例如:"/music/bands/the_beatles/?print=true"3.HttpRequest.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)返回簽名過(guò)的Cookie 對(duì)應(yīng)的值,如果簽名不再合法則返回django.core.signing.BadSignature。如果提供 default 參數(shù),將不會(huì)引發(fā)異常并返回 default 的值。可選參數(shù)salt 可以用來(lái)對(duì)安全密鑰強(qiáng)力攻擊提供額外的保護(hù)。max_age 參數(shù)用于檢查Cookie 對(duì)應(yīng)的時(shí)間戳以確保Cookie 的時(shí)間不會(huì)超過(guò)max_age 秒。復(fù)制代碼>>> request.get_signed_cookie('name')'Tony'>>> request.get_signed_cookie('name', salt='name-salt')'Tony' # 假設(shè)在設(shè)置cookie的時(shí)候使用的是相同的salt>>> request.get_signed_cookie('non-existing-cookie')...KeyError: 'non-existing-cookie' # 沒(méi)有相應(yīng)的鍵時(shí)觸發(fā)異常>>> request.get_signed_cookie('non-existing-cookie', False)False>>> request.get_signed_cookie('cookie-that-was-tampered-with')...BadSignature: ... >>> request.get_signed_cookie('name', max_age=60)...SignatureExpired: Signature age 1677.3839159 > 60 seconds>>> request.get_signed_cookie('name', False, max_age=60)False復(fù)制代碼4.HttpRequest.is_secure()如果請(qǐng)求時(shí)是安全的,則返回True;即請(qǐng)求通是過(guò) HTTPS 發(fā)起的。5.HttpRequest.is_ajax()如果請(qǐng)求是通過(guò)XMLHttpRequest 發(fā)起的,則返回True,方法是檢查 HTTP_X_REQUESTED_WITH 相應(yīng)的首部是否是字符串'XMLHttpRequest'。大部分現(xiàn)代的 JavaScript 庫(kù)都會(huì)發(fā)送這個(gè)頭部。如果你編寫自己的 XMLHttpRequest 調(diào)用(在瀏覽器端),你必須手工設(shè)置這個(gè)值來(lái)讓 is_ajax() 可以工作。如果一個(gè)響應(yīng)需要根據(jù)請(qǐng)求是否是通過(guò)AJAX 發(fā)起的,并且你正在使用某種形式的緩存例如Django 的 cache middleware, 你應(yīng)該使用 vary_on_headers('HTTP_X_REQUESTED_WITH') 裝飾你的視圖以讓響應(yīng)能夠正確地緩存。 請(qǐng)求相關(guān)方法

?注意:鍵值對(duì)的值是多個(gè)的時(shí)候,比如checkbox類型的input標(biāo)簽,select標(biāo)簽,需要用:

request.POST.getlist('hobby') request.POST.getlist('hobby')

Response對(duì)象

  與由Django自動(dòng)創(chuàng)建的HttpRequest對(duì)象相比,HttpResponse對(duì)象是我們的職責(zé)范圍了。我們寫的每個(gè)視圖都需要實(shí)例化,填充和返回一個(gè)HttpResponse。

?  HttpResponse類位于django.http模塊中。

使用

?傳遞字符串

from django.http import HttpResponse response = HttpResponse("Here's the text of the Web page.") response = HttpResponse("Text only, please.", content_type="text/plain")

?設(shè)置或刪除響應(yīng)頭信息

response = HttpResponse() response['Content-Type'] = 'text/html; charset=UTF-8' del response['Content-Type']
屬性
  • ?HttpResponse.content:響應(yīng)內(nèi)容
  • HttpResponse.charset:響應(yīng)內(nèi)容的編碼
  • HttpResponse.status_code:響應(yīng)的狀態(tài)嗎
  • JsonResponse對(duì)象

    ?  jsonResponse是HttpResponse的子類,專門用來(lái)生成JSON編碼響應(yīng)。

    from django.http import JsonResponseresponse = JsonResponse({'foo': 'bar'}) print(response.content)b'{"foo": "bar"}'

    ?默認(rèn)只能傳遞字典類型,如果要傳遞非字典類型需要設(shè)置一下safe關(guān)鍵字參數(shù)。

    response = JsonResponse([1, 2, 3], safe=False

    Django shortcut functions

    render()

      結(jié)合一個(gè)給定的模板和一個(gè)給定的上下文字典,并返回一個(gè)渲染后的HttpResponse對(duì)象。

    參數(shù):request: 用于生成響應(yīng)的請(qǐng)求對(duì)象。template_name:要使用的模板的完整名稱,可選的參數(shù)context:添加到模板上下文的一個(gè)字典。默認(rèn)是一個(gè)空字典。如果字典中的某個(gè)值是可調(diào)用的,視圖將在渲染模板之前調(diào)用它。content_type:生成的文檔要使用的MIME類型。默認(rèn)為 DEFAULT_CONTENT_TYPE 設(shè)置的值。默認(rèn)為'text/html'status:響應(yīng)的狀態(tài)碼。默認(rèn)為200。useing: 用于加載模板的模板引擎的名稱。

    redirect()

    ?參數(shù)可以是:

  • 一個(gè)模型:將調(diào)用模型的get_absolute_url()函數(shù)
  • 一個(gè)視圖,可以帶有參數(shù):將使用urlresolvers.reverse來(lái)反向解析名稱
  • 一個(gè)絕對(duì)的或相對(duì)的URL,將原封不動(dòng)的作為重定向的位置。
  • ?默認(rèn)返回一個(gè)臨時(shí)的重定向;傳遞permanent=True可以返回一個(gè)永久的重定向。

    ?實(shí)例:

    傳遞一個(gè)具體的ORM對(duì)象

      將調(diào)用具體ORM對(duì)象的get_absolute_url()方法來(lái)獲取重定向的URL:

    from django.shortcuts import redirectdef my_view(request):...object = MyModel.objects.get(...)return redirect(object)
    傳遞一個(gè)視圖的名稱
    def my_view(request):...return redirect('some-view-name', foo='bar')
    傳遞要重定向到的一個(gè)具體的網(wǎng)址
    def my_view(request):...return redirect('/some/url/')
    傳遞要重定向到一個(gè)完整的網(wǎng)站
    def my_view(request):...return redirect('http://example.com/')

      默認(rèn)情況下,redirect()返回一個(gè)臨時(shí)重定向。以上所有的形式都接收一個(gè)permanent參數(shù);如果設(shè)置為True,將返回一個(gè)永久的重定向:

    def my_view(request):...object = MyModel.objects.get(...)return redirect(object, permanent=True)
    擴(kuò)展閱讀:

      臨時(shí)重定向(響應(yīng)狀態(tài)碼:302)和永久重定向(響應(yīng)狀態(tài)碼:301)對(duì)普通用戶來(lái)說(shuō)沒(méi)上面區(qū)別,它主要面向的是搜索引擎的機(jī)器人。

  • A頁(yè)面臨時(shí)重定向到B頁(yè)面,那搜索引擎收錄的就是A頁(yè)面。
  • A頁(yè)面永久重定向到B頁(yè)面,那搜索引擎收錄的就是B頁(yè)面。
  • ?

    轉(zhuǎn)載于:https://www.cnblogs.com/ShenJunHui6/p/10717567.html

    總結(jié)

    以上是生活随笔為你收集整理的Djang视图层的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。