1. 程式人生 > >views.py文件詳解

views.py文件詳解

coo ext only method .com 判斷 ews 擁有 常用方法

1、http請求中產生的兩個核心對象

http請求:HttpRequest
http響應: HttpResponse

所在位置: django.http

1、HttpRequest:
HttpRequest對象屬性

1.1 path
請求頁面的全路徑,不包括域名,例如,"/music/bands/the_beatles/""

1.2 method
請求中使用的HTTP方法的字符串表示,全大寫表示。例如:
if request.method == ‘GET‘:
do_something()
elif request.method ==‘POST‘:
do_something_else()

1.3 GET
包含所有的HTTP GET參數的類字典。參見QueryDict文檔

1.4 POST
包含所有的HTTP GET參數的類字典。參見QueryDict文檔
服務器收到空的POST請求的情況也是有可能發生的。也就是說,表單form通過HTTP POST方法提交請求,但是表單中可以沒有數據。因此
不能使用語句if request.POST來判斷是否有使用HTTP POST方法;應該使用if request.method == "POST"(參見本表method屬性)

註意:POST不包括file-upload信息,參見FILES屬性

POST提交和GET提交最大區別:
POST提交內容不會顯示在瀏覽器上,即不以URL形式顯示在瀏覽器的地址欄上
GET提交則會完整的顯示在瀏覽器的地址欄上

1.4 REQUEST
為了方便,該屬性市POST和GET屬性的集合,但是有特殊性,先查找POST屬性,然後再查找GET屬性。借鑒PHP‘s $_REQUEST.
例如,如果GET = {"name":"john"}和POST = {"age":‘60‘},則REQUEST["name"]的值是"john",REQUEST["age"]的值是"34"
強烈建議使用GET和POST,因為這兩個屬性更加顯示化,寫出代碼更容易了解。截止到django1.8,REQUEST方法已經廢棄了,Django1.9中已經不徹底拋棄了該方法

1.5 COOKIES
包含所有cookies的標準Python字典對象,Keys和values都是字符串,參見第12章,有關cookies更詳細的講解

1.6 FILES
包含所有上傳文件的類字典對象,FILES中的每個Key都是<input type="file" name="" />標簽中的name屬性。
FILES中的每個value同時也是一個標準Python字典對象,包含下面三個Keys:
filename:上傳文件名,用Python字符串表示
content-type:上傳文件的Content type
content:上傳文件的原始內容

註意:只有在請求方法是POST,並且請求頁面中<form>有enctype="multipart/form-data" 屬性時FILES才擁有數據。否則,FILES時一個空字典


1.7 META
包含所有可用的HTTP頭部信息的字典。例如:
CONTENT_LENGTH
CONTENT_TYPE
QUERY_STRING: 未解析的原始查詢字符串
REMOTE_ADDR:客戶端IP地址
REMOTE_HOST:客戶端主機名
SERVER_NAME:服務器主機名
SERVER_PORT:服務器端口

META中這些頭加上前綴HTTP_最未Key,例如:
HTTP_ACCEPT_ENCODING
HTTP_ACCEPT_LANGUAGE
HTTP_HOST:客戶端發送的HTTP主機頭信息
HTTP_REFERER: referring頁
HTTP_USER_AGENT:客戶端的user-agent字符串
HTTP_X_BENDER:X-Bender頭信息

1.8 User
是一個django.contrib.auth.models.User對象,代表當前登錄的用戶。如果訪問用戶當前沒有登錄,user被初始化未
django.contrib.auth.models.AnonymousUser的實例。你可以通過user的is_authenticated()方法拉力辨別用戶是否登錄:
if request.user.is_authenticated():
# Do something for logged-in users
else:
# Do something for anonymous users.

註意:只有激活Django中年的AuthenticationMiddleware時,該屬性才可用


1.9 session
唯一可讀寫的屬性,代表當前會話的字典對象。只有激活Django中的session支持時該屬性才可用,
參見官方文檔第12章

1.10 raw_post_data
原始的HTTP POST數據,未解析過,高級處理時會有用過

Httprequest對象的方法(部分)

1.11 get_full_path()

返回包含查詢字符串的請求路徑。例如:
"/music/bands/the_beatles/?pring=true"
這裏要跟get_path方法區分開來,這裏路徑包含參數,get_path方法返回來不包含參數僅僅是省略域名的url路徑

QueryDict對象(部分)

1.12 get()

如果key對應多個value,get()返回最後一個value
在HttpRequest對象中,GET和POST屬性時django.http.QueryDict類的實例

2、HttpRespouse:
對於HttpRequest對象來說,是由Django自動創建,但是HttpRresponse對象就必須我們自己創建
每個View方法必須返回一個HttpRespouse對象

HttpResponse類在django.http.HttpResponse中


構造HttpRespouse:
>>> response = HttpResponse("Here‘s the text of the Web page.")
>>> response = HttpResponse("Text only,please.",{"mimetype":"text/plain"})

更詳細的有關request和response對象的介紹
https://docs.djangoproject.com/en/1.9/ref/request-response/

2、在HttpRespouse對象上擴展的常用方法
render、render_to_response、redirect

response方法:
from django.template import loader
from django.http import HttpRequest,HttpResponse

def hello(request,a):
print(request.get_full_path())
user_list = User.objects.all()
t = loader.get_template(‘table.html‘)
c={‘user_list‘:user_list}
return HttpResponse(t.render(c,request),content_type="text/html") #返回一個response對象,裏面又通過模板對象中的render方法來實現渲染

render方法
就是將上述response中的t、c等定義代碼簡化為一句代碼:

def hello(request,a):
print(request.get_full_path())
user_list = User.objects.all()
return render(request,‘table.html‘,{‘user_list‘:user_list})

render_to_response方法:相對於render方法少傳遞一個request對象

from django.shortcuts import render,render_to_response

def hello(request,a):
print(request.get_full_path())
user_list = User.objects.all()
return render_to_response(‘table.html‘,{‘user_list‘:user_list})

redirect方法
該方法是作為跳轉使用,比如上述代碼後面跳轉到百度:
from django.shortcuts import redirect

def hello(request,a):
print(request.get_full_path())
user_list = User.objects.all()
return redirect("http://www.baidu.com")

更多詳見:
https://docs.djangoproject.com/en/1.9/topics/http/shortcuts/


3、其他常用方法
locals():可以直接將函數中所有的變量全部傳遞給模板,不管是我們自己定義的還是系統定義的變量都會一起傳遞過去,不用我們自己再去拼接字典,從而達到一個簡化的目的

實例代碼:

def hello(request,a):
print(request.get_full_path())
user_list = User.objects.all()
print(locals())
return render_to_response(‘table.html‘,locals())

輸出結果變量:
/hello/
{‘a‘: ‘123‘, ‘user_list‘: [<User: admin>, <User: test>], ‘request‘: <WSGIRequest: GET ‘/hello/‘>}

views.py文件詳解