Djang视图层
視圖文件除了上面的用一系列的函數(shù)來(lái)對(duì)應(yīng)處理客戶端請(qǐng)求的數(shù)據(jù)邏輯外,還可以通過(guò)定義類來(lái)處理相應(yīng)的邏輯,首先第一步
屬性: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)
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')
? 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']? 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參數(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: 用于加載模板的模板引擎的名稱。
?參數(shù)可以是:
?默認(rèn)返回一個(gè)臨時(shí)的重定向;傳遞permanent=True可以返回一個(gè)永久的重定向。
?實(shí)例:
from django.shortcuts import redirectdef my_view(request):...object = MyModel.objects.get(...)return redirect(object)
def my_view(request):...return redirect('some-view-name', foo='bar')
def my_view(request):...return redirect('/some/url/')
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)
?
轉(zhuǎn)載于:https://www.cnblogs.com/ShenJunHui6/p/10717567.html
總結(jié)
- 上一篇: 项目alpha冲刺-总结
- 下一篇: ant-pro使用Form表单验证上传图