聲明:文章部分內(nèi)容來(lái)源https://www.cnblogs.com/maple-shaw/articles/9285269.html
站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到新和網(wǎng)站設(shè)計(jì)與新和網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋新和地區(qū)。views.py
的文件中。from django.http import HttpResponse
import datetime
#從 django.http模塊導(dǎo)入了HttpResponse類,以及Python的datetime模塊。
def current_datetime(request):
#定義了current_datetime函數(shù)。它就是視圖函數(shù)。每個(gè)視圖函數(shù)都使用HttpRequest對(duì)象作為第一個(gè)參數(shù),并且通常稱之為request。
now = datetime.datetime.now()
#獲取當(dāng)前時(shí)間
html = "<html><body>It is now %s.</body></html>" % now
#定義一個(gè)變量等于后面的字符串
return HttpResponse(html)
#返回一個(gè)HttpResponse對(duì)象,其中包含生成的響應(yīng)。每個(gè)視圖函數(shù)都負(fù)責(zé)返回一個(gè)HttpResponse對(duì)象。
Django使用請(qǐng)求和響應(yīng)對(duì)象來(lái)通過(guò)系統(tǒng)傳遞狀態(tài)。
當(dāng)瀏覽器向服務(wù)端請(qǐng)求一個(gè)頁(yè)面時(shí),Django創(chuàng)建一個(gè)HttpRequest對(duì)象,該對(duì)象包含關(guān)于請(qǐng)求的元數(shù)據(jù)。然后,Django加載相應(yīng)的視圖,將這個(gè)HttpRequest對(duì)象作為第一個(gè)參數(shù)傳遞給視圖函數(shù)。
每個(gè)視圖負(fù)責(zé)返回一個(gè)HttpResponse對(duì)象。
from django.http import HttpResponse
#導(dǎo)入HttpResponse模塊,這個(gè)模塊可以幫我們把字符串返回給網(wǎng)頁(yè)
def add_class(request):
if request.method == "POST":
return HttpResponse("POST")
return HttpResponse('GET')
#實(shí)現(xiàn)效果,如果發(fā)過(guò)來(lái)的是GET請(qǐng)求就返回GET,如果是POST請(qǐng)求就返回POST
from django.http import HttpResponse
from django.views import View
#導(dǎo)入HttpResponse和View導(dǎo)入視圖模塊,方便我們創(chuàng)建類時(shí)繼承View
class AddClass(View):
def get(self, request):#處理get請(qǐng)求
return HttpResponse('get')
def post(self, request):#處理post請(qǐng)求
return HttpResponse('post')
#實(shí)現(xiàn)效果,如果發(fā)過(guò)來(lái)的是GET請(qǐng)求就返回GET,如果是POST請(qǐng)求就返回POST
#在url中的修改配置
url(r'^add_class/$', views.要使用的類的名字.as_view())
FBV本身就是一個(gè)函數(shù),所以根普通的函數(shù)加裝飾器方法無(wú)差別:
def wrapper(func):
def inner(*args, **kwargs):
start_time = time.time()#在執(zhí)行前計(jì)算時(shí)間戳
ret = func(*args, **kwargs)
end_time = time.time()#執(zhí)行后的時(shí)間戳
print("函數(shù)執(zhí)行時(shí)間是:", end_time-start_time)
return ret
return inner
#裝飾器作用,求出函數(shù)執(zhí)行的時(shí)間,并輸出
@wrapper
def add_class(request):
if request.method == "POST":
return HttpResponse("POST")
return HttpResponse('GET')
Django中提供了method_decorator裝飾器用于將函數(shù)裝飾器轉(zhuǎn)換為方法裝飾器。
from django.utils.decorators import method_decorator#導(dǎo)入方法
def timer(func):
def inner(*args, **kwargs):
start_time = time.time()#在執(zhí)行前計(jì)算時(shí)間戳
ret = func(*args, **kwargs)
end_time = time.time()#執(zhí)行后的時(shí)間戳
print("函數(shù)執(zhí)行時(shí)間是:", end_time-start_time)
return ret
return inner
#直接加在類中方法上
@method_decorator(timer)括號(hào)內(nèi)為裝飾器自己寫的裝飾器名字
def get(self, request, *args, **kwargs):
#加在dispatch方法上
#方式一
@method_decorator(timer)
def dispatch(self, request, *args, **kwargs):
# print('before')
ret = super().dispatch(request, *args, **kwargs)
# print('after')
return ret
#方式二
@method_decorator(timer,name='dispatch')
class AddPublisher(View):
#加在類上
#@method_decorator(timer,name='post')name代表要加在類中方法的名字
@method_decorator(timer,name='get')
class AddPublisher(View):
當(dāng)然直接給類中方法加裝飾器也是可以的,不過(guò)和通過(guò)使用method_decorator的有一些區(qū)別,下面我們就通過(guò)代碼看下具體區(qū)別吧
直接裝飾,打印func,args結(jié)果:
func結(jié)果:<function AddClass.get at 0x03DF5390>
args結(jié)果:(<app.views.AddClass object at 0x040D8D10>, <WSGIRequest: GET '/cbv'>)
通過(guò)method_decorator裝飾,打印func,args結(jié)果:
func結(jié)果:<function method_decorator.<locals>._dec.<locals>._wrapper.<locals>.bound_func at 0x045ED540>
args結(jié)果:(<WSGIRequest: GET '/cbv'>,)
區(qū)別:通過(guò)上面代碼,我們可以看出直接加裝飾器的話,裝飾器的args是有兩個(gè)值的,后面的值才是request對(duì)象,使用時(shí)需要取索引位置1的值才能夠調(diào)用request對(duì)象,
而通過(guò)method_decorator裝飾,裝飾器args只有一個(gè)值,使用request時(shí)只需要取索引位置0的值就能夠調(diào)用request對(duì)象,所以我們使用時(shí)需要注意加裝飾器的方法和args到底應(yīng)該取得哪個(gè)位置?。。。?!
request屬性 | 作用 |
---|---|
request.methot | 請(qǐng)求方式 |
request.path_info | URL的路徑 不包含ip和端口 不包含參數(shù) |
request.POST | POST請(qǐng)求提交的數(shù)據(jù) |
request.body | 請(qǐng)求體, byte類型 request.POST的數(shù)據(jù)就是從body里面提取到的 |
request.FILES | 上傳的文件 |
request.META | 請(qǐng)求頭 |
request.COOKIES | 后面講 |
request.session | 后面講 |
request.encoding | 表示提交的數(shù)據(jù)的編碼方式(如果為 None 則表示使用 DEFAULT_CHARSET 的設(shè)置,默認(rèn)為 'utf-8')。 |
request.body
一個(gè)字符串,代表請(qǐng)求報(bào)文的主體。在處理非 HTTP 形式的報(bào)文時(shí)非常有用,例如:二進(jìn)制圖片、XML,Json等。
但是,如果要處理表單數(shù)據(jù)的時(shí)候,推薦還是使用 HttpRequest.POST 。
另外,我們還可以用 python 的類文件方法去操作它,詳情參考 HttpRequest.read() 。
request.FILES
一個(gè)類似于字典的對(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è)空的類似于字典的對(duì)象。
def file(request):#定義一個(gè)函數(shù)
if request.method == "POST":#如果類型為post
fname = request.FILES.get('f1')#取出發(fā)送來(lái)的對(duì)象
with open(fname.name,'wb') as f:#fname.name方法能夠取出上傳的文件名稱
for i in fname.chunks():#fname.chunks()方法能夠取出上傳的數(shù)據(jù),進(jìn)行for循環(huán)
f.write(i)#把循環(huán)的值寫入打開(kāi)的文件
return HttpResponse('上傳ok')#上傳完畢后返回成功
return render(request,'sc.html')#如果不是post請(qǐng)求返回sc.html頁(yè)面
request.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 鍵。
#注意:鍵值對(duì)的值是多個(gè)的時(shí)候,比如checkbox類型的input標(biāo)簽,select標(biāo)簽,需要用:
request.POST.getlist("")取值
request方法 | 作用 |
---|---|
request.get_full_path() | URL的路徑 不包含ip和端口 包含參數(shù) |
request.is_ajax() | 判斷是不是ajax請(qǐng)求 |
Httpresponse屬性 | 作用 |
---|---|
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.shortcuts import render, redirect, HttpResponse
HttpResponse('字符串') ——》 ’字符創(chuàng)‘
render(request,'模板的文件名',{k1:v1}) ——》 返回一個(gè)完整的TML頁(yè)面
redirect('重定向的地址') ——》 重定向 Location : 地址
from django.http.response import JsonResponse
JsonResponse({})
JsonResponse([],safe=False)
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
新聞名稱:Django視圖(View)-創(chuàng)新互聯(lián)
瀏覽地址:http://aaarwkj.com/article36/ggjpg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁(yè)設(shè)計(jì)公司、服務(wù)器托管、用戶體驗(yàn)、品牌網(wǎng)站制作、面包屑導(dǎo)航、動(dòng)態(tài)網(wǎng)站
聲明:本網(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)
猜你還喜歡下面的內(nèi)容