HttpResponse對象
Django服務器接收到客戶端發送過來的請求后,會將提交上來的這些數據封裝成一個HttpRequest
對象傳給視圖函數。那么視圖函數在處理完相關的邏輯后,也需要返回一個響應給瀏覽器。而這個響應,我們必須返回HttpResponseBase
或其子類的對象。而HttpResponse
則是HttpResponseBase
用得最多的子類。那么接下來就來介紹一下HttpResponse
及其子類,HttpResponse對象的屬性和HTTPRequest對象的屬性不同,HTTPResponse對象的屬性是由服務端發送給瀏覽器的,所以很多屬性都是由我們自己設置的。
常用屬性:
- content:返回的內容。
- status_code:返回的HTTP響應狀態碼。
響應頭:
- Content-Encoding:指定報文主體已經采用的編碼方式,注意這個編碼方式必須在request的Accept-Encoding中存在,否則客戶端將無法解析報文主體。
- Content-Length:報文主體的長度。
- Transfer-Encoding: 用於指定傳輸報文主體時使用的編碼方式,(傳輸過程中的編碼格式,代理服務器之間)
- content_type:返回的數據的MIME類型,默認為
text/html
。瀏覽器會根據這個屬性,來顯示數據。如果是text/html
,那么瀏覽器就會把content屬性中的內容按照HTML格式解析,如果text/plain
,那么就會顯示一個純文本。常用的Content-Type
如下:- text/html(默認的,html文件)
- text/plain(純文本)
- text/css(css文件)
- text/csv (csv文件)
- text/javascript(js文件)
- multipart/form-data(文件提交)
- application/json(json傳輸)
- application/xml(xml文件)
- application/vnd.ms-excel (excel文件)
常用方法:
- set_cookie:用來設置
cookie
信息。后面講到授權的時候會着重講到。 - delete_cookie:用來刪除
cookie
信息。 - write:
HttpResponse
是一個類似於文件的對象,可以用來寫入數據到數據體(content)中,新寫入的內容會在原先content之后。 - 設置響應頭,通過設置字典的方式設置響應頭,例如我們可以設置一些csrftoken相關的驗證信息到響應頭:
response['X-Access-Token'] = 'xxxx',我們也可以在response生成csv或者Excel文件時,設置相應的響應頭來描述生成的文件信息:response['Content-Disposition'] = 'attachment;filename="abc.xls"'
JsonResponse類:
如果不使用JsonResponse,只使用HttpResponse,我們想要返回一個json字符串也是可行的,要點有兩個:
1、把content中要返回的內容是由json模塊dumps成json字符串
2、設置content_type為'application/json'
示例代碼如下:
from django.http import HttpResponse
def jsonresponse_view(request):
person = {
'name': 'xdm',
'age': 19
}
person_str = json.dumps(person)
response = HttpResponse(person_str , content_type='application/json; charset=utf-8')
return response
上面原生的方式可以解決返回json字符串的需求,注意使用HTTPResponse時,我們需要把返回的數據先dumps成json字符串。如果我們直接使用JsonResponse方式會更簡單,實質上JsonResponse也是繼承HttpResponse,其內部處理和上面我們演示的原理相同,也是把content內容先dumps成json字符串,content_type='application/json'這兩個規則,此時,在使用時直接返回可以dumps的content數據即可,不需要自己再去做dumps操作。示例代碼如下:
from django.http import JsonResponse
def jsonresponse_view(request):
person = {
'name': 'xdm',
'age': 19
}
response = JsonResponse(person)
return response
默認情況下JsonResponse
只能對字典進行dumps
,如果想要對非字典的數據進行dumps
,那么需要給JsonResponse
傳遞一個safe=False
參數。示例代碼如下:
from django.http import JsonResponse def index(request): persons = ['張三','李四','王五'] return HttpResponse(persons)
以上代碼會報錯,應該在使用HttpResponse
的時候,傳入一個safe=False
參數,示例代碼如下:
return HttpResponse(persons,safe=False)