django之HTTPResponse和JsonResponse詳解


HttpResponse對象

Django服務器接收到客戶端發送過來的請求后,會將提交上來的這些數據封裝成一個HttpRequest對象傳給視圖函數。那么視圖函數在處理完相關的邏輯后,也需要返回一個響應給瀏覽器。而這個響應,我們必須返回HttpResponseBase或其子類的對象。而HttpResponse則是HttpResponseBase用得最多的子類。那么接下來就來介紹一下HttpResponse及其子類,HttpResponse對象的屬性和HTTPRequest對象的屬性不同,HTTPResponse對象的屬性是由服務端發送給瀏覽器的,所以很多屬性都是由我們自己設置的。

 

常用屬性:

  1. content:返回的內容。
  2. status_code:返回的HTTP響應狀態碼。

響應頭:

  1. Content-Encoding:指定報文主體已經采用的編碼方式,注意這個編碼方式必須在request的Accept-Encoding中存在,否則客戶端將無法解析報文主體。
  2. Content-Length:報文主體的長度。
  3. Transfer-Encoding:  用於指定傳輸報文主體時使用的編碼方式,(傳輸過程中的編碼格式,代理服務器之間)
  4. 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文件)

常用方法:

  1. set_cookie:用來設置cookie信息。后面講到授權的時候會着重講到。
  2. delete_cookie:用來刪除cookie信息。
  3. writeHttpResponse是一個類似於文件的對象,可以用來寫入數據到數據體(content)中,新寫入的內容會在原先content之后。
  4. 設置響應頭,通過設置字典的方式設置響應頭,例如我們可以設置一些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)




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM