這篇文章主要介紹了Django如何實(shí)現(xiàn)視圖,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
創(chuàng)新互聯(lián)主要從事成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)新樂(lè),10多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):13518219792
一個(gè)視圖函數(shù)(類(lèi)),簡(jiǎn)稱視圖,是一個(gè)簡(jiǎn)單的Python 函數(shù)(類(lèi)),它接受Web請(qǐng)求并且返回Web響應(yīng)。
響應(yīng)可以是一張網(wǎng)頁(yè)的HTML內(nèi)容,一個(gè)重定向,一個(gè)404錯(cuò)誤,一個(gè)XML文檔,或者一張圖片。
from django.http import HttpResponse import datetime def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now return HttpResponse(html)
首先,我們從 django.http模塊導(dǎo)入了HttpResponse類(lèi),以及Python的datetime庫(kù)。
接著,我們定義了current_datetime函數(shù)。它就是視圖函數(shù)。每個(gè)視圖函數(shù)都使用HttpRequest對(duì)象作為第一個(gè)參數(shù),并且通常稱之為request。
注意,視圖函數(shù)的名稱并不重要;不需要用一個(gè)統(tǒng)一的命名方式來(lái)命名,以便讓Django識(shí)別它。我們將其命名為current_datetime,是因?yàn)檫@個(gè)名稱能夠比較準(zhǔn)確地反映出它實(shí)現(xiàn)的功能。
這個(gè)視圖會(huì)返回一個(gè)HttpResponse對(duì)象,其中包含生成的響應(yīng)。每個(gè)視圖函數(shù)都負(fù)責(zé)返回一個(gè)HttpResponse對(duì)象。
基于函數(shù)的view,就叫FBV。還可以把view寫(xiě)成基于類(lèi)的,叫CBV。
# FBV版添加班級(jí)
def add_class(request):
if request.method == "POST":
class_name = request.POST.get("class_name")
models.Classes.objects.create(name=class_name)
return redirect("/class_list/")
return render(request, "add_class.html")# CBV版添加班級(jí)
from django.views import View
class AddClass(View):
def get(self, request):
return render(request, "add_class.html")
def post(self, request):
class_name = request.POST.get("class_name")
models.Classes.objects.create(name=class_name)
return redirect("/class_list/")注意:使用CBV時(shí),urls.py中也做對(duì)應(yīng)的修改:
# urls.py中
url('add_class/', views.AddClass.as_view()),FBV本身就是一個(gè)函數(shù),所以和給普通的函數(shù)加裝飾器無(wú)差:
def wrapper(func):
def inner(*args, **kwargs):
start_time = time.time()
ret = func(*args, **kwargs)
end_time = time.time()
print("used:", end_time-start_time)
return ret
return inner
# FBV版添加班級(jí)
@wrapper
def add_class(request):
if request.method == "POST":
class_name = request.POST.get("class_name")
models.Classes.objects.create(name=class_name)
return redirect("/class_list/")
return render(request, "add_class.html")類(lèi)中的方法與獨(dú)立函數(shù)不完全相同,因此不能直接將函數(shù)裝飾器應(yīng)用于類(lèi)中的方法 ,我們需要先將其轉(zhuǎn)換為方法裝飾器。
Django中提供了method_decorator裝飾器用于將函數(shù)裝飾器轉(zhuǎn)換為方法裝飾器。
# CBV版添加班級(jí)
from django.views import View
from django.utils.decorators import method_decorator
class AddClass(View):
@method_decorator(wrapper)
def get(self, request):
return render(request, "add_class.html")
def post(self, request):
class_name = request.POST.get("class_name")
models.Classes.objects.create(name=class_name)
return redirect("/class_list/")當(dāng)一個(gè)頁(yè)面被請(qǐng)求時(shí),Django就會(huì)創(chuàng)建一個(gè)包含本次請(qǐng)求原信息的HttpRequest對(duì)象。Django會(huì)將這個(gè)對(duì)象自動(dòng)傳遞給響應(yīng)的視圖函數(shù),一般視圖函數(shù)約定俗成地使用 request參數(shù)承接這個(gè)對(duì)象。官方文檔
path_info返回用戶訪問(wèn)url,不包括域名
method請(qǐng)求中使用的HTTP方法的字符串表示,全大寫(xiě)表示。
GET包含所有HTTP GET參數(shù)的類(lèi)字典對(duì)象
POST包含所有HTTP POST參數(shù)的類(lèi)字典對(duì)象
body請(qǐng)求體,byte類(lèi)型 request.POST的數(shù)據(jù)就是從body里面提取到的
所有的屬性應(yīng)該被認(rèn)為是只讀的,除非另有說(shuō)明。
屬性: django將請(qǐng)求報(bào)文中的請(qǐng)求行、頭部信息、內(nèi)容主體封裝成 HttpRequest 類(lèi)中的屬性。 除了特殊說(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 的類(lèi)文件方法去操作它,詳情參考 HttpRequest.read() 。 2.HttpRequest.path 一個(gè)字符串,表示請(qǐng)求的路徑組件(不含域名)。 例如:"/music/bands/the_beatles/" 3.HttpRequest.method 一個(gè)字符串,表示請(qǐng)求使用的HTTP 方法。必須使用大寫(xiě)。 例如:"GET"、"POST" 4.HttpRequest.encoding 一個(gè)字符串,表示提交的數(shù)據(jù)的編碼方式(如果為 None 則表示使用 DEFAULT_CHARSET 的設(shè)置,默認(rèn)為 'utf-8')。 這個(gè)屬性是可寫(xiě)的,你可以修改它來(lái)修改訪問(wèn)表單數(shù)據(jù)使用的編碼。 接下來(lái)對(duì)屬性的任何訪問(wèn)(例如從 GET 或 POST 中讀取數(shù)據(jù))將使用新的 encoding 值。 如果你知道表單數(shù)據(jù)的編碼不是 DEFAULT_CHARSET ,則使用它。 5.HttpRequest.GET 一個(gè)類(lèi)似于字典的對(duì)象,包含 HTTP GET 的所有參數(shù)。詳情請(qǐng)參考 QueryDict 對(duì)象。 6.HttpRequest.POST 一個(gè)類(lèi)似于字典的對(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è)類(lèi)似于字典的對(duì)象,包含所有的上傳文件信息。 FILES 中的每個(gè)鍵為<input type="file" name="" /> 中的name,值則為對(duì)應(yīng)的數(shù)據(jù)。 注意,F(xiàn)ILES 只有在請(qǐng)求的方法為POST 且提交的<form> 帶有enctype="multipart/form-data" 的情況下才會(huì) 包含數(shù)據(jù)。否則,F(xiàn)ILES 將為一個(gè)空的類(lèi)似于字典的對(duì)象。 9.HttpRequest.META 一個(gè)標(biāo)準(zhǔn)的Python 字典,包含所有的HTTP 首部。具體的頭部信息取決于客戶端和服務(wù)器,下面是一些示例: CONTENT_LENGTH —— 請(qǐng)求的正文的長(zhǎng)度(是一個(gè)字符串)。 CONTENT_TYPE —— 請(qǐng)求的正文的MIME 類(lèi)型。 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ì)將所有字母大寫(xiě)并將連接符替換為下劃線最后加上 HTTP_ 前綴。 所以,一個(gè)叫做 X-Bender 的頭部將轉(zhuǎn)換成 META 中的 HTTP_X_BENDER 鍵。 10.HttpRequest.user 一個(gè) AUTH_USER_MODEL 類(lèi)型的對(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.AnonymousUser django.contrib.auth.models.AnonymousUser 類(lèi)實(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è)既可讀又可寫(xiě)的類(lèi)似于字典的對(duì)象,表示當(dāng)前的會(huì)話。只有當(dāng)Django 啟用會(huì)話的支持時(shí)才可用。 完整的細(xì)節(jié)參見(jiàn)會(huì)話的文檔。
上傳文件示例
def upload(request):
"""
保存上傳文件前,數(shù)據(jù)需要存放在某個(gè)位置。默認(rèn)當(dāng)上傳文件小于2.5M時(shí),django會(huì)將上傳文件的全部?jī)?nèi)容讀進(jìn)內(nèi)存。從內(nèi)存讀取一次,寫(xiě)磁盤(pán)一次。
但當(dāng)上傳文件很大時(shí),django會(huì)把上傳文件寫(xiě)到臨時(shí)文件中,然后存放到系統(tǒng)臨時(shí)文件夾中。
:param request:
:return:
"""
if request.method == "POST":
# 從請(qǐng)求的FILES中獲取上傳文件的文件名,file為頁(yè)面上type=files類(lèi)型input的name屬性值
filename = request.FILES["file"].name
# 在項(xiàng)目目錄下新建一個(gè)文件
with open(filename, "wb") as f:
# 從上傳的文件對(duì)象中一點(diǎn)一點(diǎn)讀
for chunk in request.FILES["file"].chunks():
# 寫(xiě)入本地文件
f.write(chunk)
return HttpResponse("上傳OK")鍵值對(duì)的值是多個(gè)的時(shí)候,比如checkbox類(lèi)型的input標(biāo)簽,select標(biāo)簽,需要用:
request.POST.getlist("hobby")傳遞字符串
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是HttpResponse的子類(lèi),專門(mén)用來(lái)生成JSON編碼的響應(yīng)。
from django.http import JsonResponse
response = JsonResponse({'foo': 'bar'})
print(response.content)
b'{"foo": "bar"}'默認(rèn)只能傳遞字典類(lèi)型,如果要傳遞非字典類(lèi)型需要設(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類(lèi)型。默認(rèn)為 DEFAULT_CONTENT_TYPE 設(shè)置的值。默認(rèn)為'text/html' - status:響應(yīng)的狀態(tài)碼。默認(rèn)為200。 - useing: 用于加載模板的模板引擎的名稱。
一個(gè)簡(jiǎn)單的例子:
from django.shortcuts import render
def my_view(request):
# 視圖的代碼寫(xiě)在這里
return render(request, 'myapp/index.html', {'foo': 'bar'})傳遞一個(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)真閱讀完這篇文章,希望小編分享的“Django如何實(shí)現(xiàn)視圖”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!
分享文章:Django如何實(shí)現(xiàn)視圖
網(wǎng)頁(yè)路徑:http://chinadenli.net/article14/ipgige.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、做網(wǎng)站、網(wǎng)站策劃、響應(yīng)式網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)