response對象
HttpResponse的使用
HttpRequest對象由Django自動創建,HttpResponse對象則由我們手動創建。我們設計的每一個視圖都需要實例化,填充和返回一個HttpResponse,也就是函數的return的值。
傳遞字符串
from django.http import HttpResponse
response = HttpResponse("THIS IS HTTPRESPONSE")
response = HttpResponse("只能傳字符串", content_type="text/plain")
設置或刪除響應頭信息
response = HttpResponse()
response['Content-Type'] = 'text/html; charset=UTF-8'
del response['Content-Type']
HttpResponse的屬性
HttpResponse.content:響應內容,bytes類型
HttpResponse.charset:響應內容的編碼,如果沒指定,將會從content_type中解析出來。
HttpResponse.status_code:響應的狀態碼,比如404,200。
HttpResponse.reason_phrase:響應的HTTP原因短語。
JsonResponse對象
JsonResponse是HttpResponse的一個子類,是Django提供的用於創建Json編碼類型響應的快捷類。
from django.http import JsonResponse
response = JsonResponse({'jjzz': 'jjzz on the world'})
print(response.content)
b'{'jjzz': 'jjzz on the world'}'
【注意】
默認情況下,JsonResponse只能傳遞字典類型,如果要序列化非字典類型需要設置一下safe關鍵字參數,如果沒有傳遞safe,會報TypeError錯誤。
response = JsonResponse([1, 2, 3], safe=False)
與HttpResponse的區別
- Content-Type頭部默認設置為application/json,HttpResponse的響應頭是text/html
- 傳遞的參數通常應該為一個字典數據類型
- 只有設置safe = False,才能序列化除字典以外的其他對象
Django shortcut functions
render()
結合一個給定的模板和一個給定的上下文字典,並返回一個渲染后的 HttpResponse 對象。
參數:
- request: 用於生成響應的請求對象。
- template_name:要使用的模板的完整名稱,可選的參數
- context:添加到模板上下文的一個字典。默認是一個空字典。如果字典中的某個值是可調用的,視圖將在渲染模板之前調用它。
- content_type:生成的文檔要使用的MIME類型。默認為 DEFAULT_CONTENT_TYPE 設置的值。默認為'text/html'
- status:響應的狀態碼。默認為200。
- useing: 用於加載模板的模板引擎的名稱。
#
from django.shortcuts import render
def my_view(request):
# 視圖的代碼寫在這里
return render(request, 'myapp/index.html', {'foo': 'bar'})
# 上面方式及等同於下面的方式
from django.http import HttpResponse
from django.template import loader
def my_view(request):
# 視圖代碼寫在這里
t = loader.get_template('myapp/index.html')
c = {'foo': 'bar'}
return HttpResponse(t.render(c, request))
redirect()
參數可以是:
- 一個模型:將調用模型的
get_absolute_url()
函數 - 一個視圖,可以帶有參數:將使用
urlresolvers.reverse
來反向解析名稱 - 一個絕對的或相對的URL,將原封不動的作為重定向的位置。
默認返回一個臨時的重定向;傳遞permanent=True
可以返回一個永久的重定向。
使用redirect()
函數
傳遞一個具體的ORM對象
將調用具體ORM對象的get_absolute_url()
方法來獲取重定向的URL:
from django.shortcuts import redirect
def my_view(request):
...
object = MyModel.objects.get(...)
return redirect(object)
傳遞一個視圖的名稱
def my_view(request):
...
return redirect('some-view-name', foo='bar')
傳遞要重定向到的一個具體的網址
def my_view(request):
...
return redirect('/some/url/')
當然也可以是一個完整的網址
def my_view(request):
...
return redirect('http://example.com/')
默認情況下,redirect()
返回一個臨時重定向。以上所有的形式都接收一個permanent
參數;如果設置為True
,將返回一個永久的重定向:
def my_view(request):
...
object = MyModel.objects.get(...)
return redirect(object, permanent=True)
擴展閱讀:
臨時重定向(響應狀態碼:302)和永久重定向(響應狀態碼:301)對普通用戶來說是沒什么區別的,它主要面向的是搜索引擎的機器人。
A頁面臨時重定向到B頁面,那搜索引擎收錄的就是A頁面。
A頁面永久重定向到B頁面,那搜索引擎收錄的就是B頁面。