HttpResponse物件
Django伺服器接收到客戶端傳送過來的請求後,會將提交上來的這些資料封裝成一個HttpRequest
物件傳給檢視函式。那麼檢視函式在處理完相關的邏輯後,也需要返回一個響應給瀏覽器。而這個響應,我們必須返回HttpResponseBase
或者他的子類的物件。而HttpResponse
則是HttpResponseBase
用得最多的子類。那麼接下來就來介紹一下HttpResponse
及其子類。
常用屬性
- content:返回的內容。
- status_code:返回的HTTP響應狀態碼。
- content_type:返回的資料的MIME型別,預設為
text/html
。瀏覽器會根據這個屬性,來顯示資料。如果是text/html
,那麼就會解析這個字串,如果text/plain
,那麼就會顯示一個純文字。常用的Content-Type
如下:- text/html(預設的,html檔案)
- text/plain(純文字)
- text/css(css檔案)
- text/javascript(js檔案)
- multipart/form-data(檔案提交)
- application/json(json傳輸)
- application/xml(xml檔案)
- 設定請求頭:
response['X-Access-Token'] = 'xxxx'
。
常用方法
- set_cookie:用來設定
cookie
資訊。 - delete_cookie:用來刪除
cookie
資訊。 - write:
HttpResponse
是一個類似於檔案的物件,可以用來寫入資料到資料體(content)中。
JsonResponse類
用來將物件dump
成json
字串,然後返回將json
字串封裝成Response
物件返回給瀏覽器。並且他的Content-Type
是application/json
。示例程式碼如下:
from django.http import JsonResponse
def index(request):
return JsonResponse({"username":"jkc","age":18})
預設情況下JsonResponse
只能對字典進行dump
,如果想要對非字典的資料進行dump
,那麼需要給JsonResponse
傳遞一個safe=False
引數。示例程式碼如下:
def index(request):
list1 = [
{"username": "jkc", "age": 18},
{"username": "a", "age": 20},
{"username": "b", "age": 22},
]
return JsonResponse(list1, safe=False)
上述程式碼我們定義了一個列表,當我們想要把非字典格式的資料進行dump
,那麼就需要新增引數safe=False
JsonResponse類原始碼分析
class JsonResponse(HttpResponse):
"""
An HTTP response class that consumes data to be serialized to JSON.
:param data: Data to be dumped into json. By default only ``dict`` objects
are allowed to be passed due to a security flaw before EcmaScript 5. See
the ``safe`` parameter for more information.
:param encoder: Should be a json encoder class. Defaults to
``django.core.serializers.json.DjangoJSONEncoder``.
:param safe: Controls if only ``dict`` objects may be serialized. Defaults
to ``True``.
:param json_dumps_params: A dictionary of kwargs passed to json.dumps().
"""
def __init__(self, data, encoder=DjangoJSONEncoder, safe=True,
json_dumps_params=None, **kwargs):
if safe and not isinstance(data, dict):
raise TypeError(
'In order to allow non-dict objects to be serialized set the '
'safe parameter to False.'
)
if json_dumps_params is None:
json_dumps_params = {}
kwargs.setdefault('content_type', 'application/json')
data = json.dumps(data, cls=encoder, **json_dumps_params)
super().__init__(content=data, **kwargs)
我們可以看到JsonResponse
是繼承於HttpResponse
,寫了一個初始化方法,方法中有5個引數
- data:需要轉換的資料
- encoder:json編碼器
- safe:控制是否只有
dict
物件可以序列化,預設為True - json_dumps_params:字典通過
json.dumps()
轉化
中間程式碼的翻譯是:如果safe
設定為True
並且data的資料型別不是dict
,那麼丟擲一個TypeError
型別錯誤,如果json_dumps_params
為None
,kwargs
設定一個預設值content_type='application/json'
,規定了返回的是json
格式,最後把字典格式的資料轉換成json
格式