視圖函數
視圖函數,接受Web請求並且返回Web響應(必須返回響應) 響應可以是一張網頁的HTML內容,一個重定向,一個404錯誤
from django.shortcuts import render, HttpResponse,redirect def current_datetime(request): html = "<html><body>你好</body></html>" return HttpResponse(html)
每個視圖函數都需要接收請求和返回響應,使用HttpRequest對象作爲第一個參數, 並且通常稱之爲request。每個視圖函數都負責返回一個HttpResponse對象,其中包含生成的響應
Request對象
request屬性:
django將請求報文中的請求行、首部信息、內容主體封裝成 HttpRequest類中的屬性
1. request.method 獲取請求的方法
值爲一個字符串,"GET"、"POST",必須使用大寫 對請求方法進行判斷if request.method=="POST":pass
2.request.GET 通常用來獲取URL裏面的參數
值爲QueryDict對象,類似於字典,包含HTTP GET的所有參數
如:127.0.0.1:8000/edit_book/?id=1&name=jerd request.GET --> {"id":1, "name":"jerd"} request.GET.get("id") #1
3.request.POST 用來獲取POST提交過來的數據
1.POST請求可以帶有空的POST字典,如果通過POST發送一個表單,但是表單中沒有任何的數據, QueryDict 對象依然會被創建。 2.如果使用POST上傳文件的話,文件信息將包含在FILES屬性中 request.FIlES.get('upload_file') 3.鍵值對的值是多個的時候,比如checkbox類型的input標籤,select標籤 需要用request.POST.getlist("hobby")
4.request.path_info
獲取用戶請求的路徑(不包含IP和端口和URL參數) 在網頁上輸入http://127.0.0.1:8000/t_test/ print(request.path_info) 結果:/t_test/
5.request.get_full_path()
在網頁上輸入http://127.0.0.1:8000/t_test/ print(request.get_full_path()) 結果:/t_test/ 在網頁上輸入http://127.0.0.1:8000/t_test/?page=5 print(request.get_full_path()) 結果:/t_test/?page=5
6.request.FILES
一個類似於字典的對象,包含所有的上傳文件信息。
print(request.FILES) #{'upload_file': [<InMemoryUploadedFile: 0020033025290064_b.jpg (image/jpeg)>]}> file_obj=request.FIlES.get('upload_file')
在使用form表單提交文件時,表單中必須帶有enctype="multipart/form-data 否則FILES將爲一個空的QueryDict
上傳文件
'''
urls文件
from django.conf.urls import url
from app import views
url(r'^upload/', views.upload),
html文件
enctype必須要寫 form中的input必須有name屬性,且注意csrf阻攔
<form action="/upload/,method="post",enctype="multipart/form-data>
{% csrf_token %}
< input type = "file" name = "upload_file" >
< input type = "submit" value = "開始上傳" >
</form>
views文件
from django.shortcuts import HttpResponse,render,redirect
def upload(request):
if request.method=="POST":
file爲頁面上type = files類型input的name屬性值
print(request.FILES) #{'upload_file': [<InMemoryUploadedFile: 0020033025290064_b.jpg (image/jpeg)>]}>
file_obj=request.FIlES.get('upload_file')
filename=file_obj.name
with open(filename,"wb") as f:
# 從上傳的文件對象中一點一點讀
for chunk in request.FILES['file'].chunks():
f.write(chunk)
##從上傳的文件對象中一行一行
for line in file_obj:
f.write(line)
return HttpResponse("上傳成功")
return render(request,"upload.html")
'''
Response對象
響應對象主要有三種形式:
1. HttpResponse --> 返回字符串內容 2. render --> 返回一個html頁面 3. redirect --> 返回一個重定向(告訴瀏覽器再去訪問另外的網址)
render方法是結合一個給定的模板和一個給定的上下文字典,將模板頁面中的模板語法(在html中爲{{}} {% %}) 進行渲染,將渲染後的html頁面作爲響應體。響應的狀態碼。默認爲200。 return render(request, 'index.html', {'name': 'zhao'}) redirect:傳遞要重定向的一個硬編碼的URL
def login(request): return redirect("/login/")
也可傳遞一個完整的url 默認情況下,redirect() 返回一個臨時重定向,響應狀態碼:302 redirect都接收一個permanent 參數;如果設置爲True,將返回一個永久的重定向,響應狀態碼:301 return redirect("/login/", permanent=True) A頁面臨時重定向到B頁面,那搜索引擎收錄的就是A頁面。 A頁面永久重定向到B頁面,那搜索引擎收錄的就是B頁面。
301和302的區別
301和302狀態碼都表示重定向,瀏覽器在拿到服務器返回的這個狀態碼後會自動跳轉到一個新的URL地址, (用戶看到的效果就是他輸入的地址A瞬間變成了另一個地址B) 不同處: 301表示舊地址A的資源已經被永久地移除了,搜索引擎在抓取新內容的同時也將舊的網址交換爲重定向之後的網址; 302表示舊地址A的資源還在(仍然可以訪問),這個重定向只是臨時地從舊地址A跳轉到地址B, 搜索引擎會抓取新的內容而保存舊的網址。
重定向原因
(1)網站調整(如改變網頁目錄結構); (2)網頁被移到一個新地址; (3)網頁擴展名改變(如應用需要把.php改成.Html或.shtml)。 如果不做重定向,則用戶收藏夾或搜索引擎數據庫中舊地址只能讓訪問客戶得到一個404頁面錯誤信息
JsonResponse對象
JsonResponse是HttpResponse的子類,專門用來生成JSON編碼的響應
1.HttpResponse返回的都是字符串,如果要傳字典和列表需要序列化處理
def t_test(request): li=[1,2,3] dic={"k1":jerd,"k2":"dandan"} import json str_li=json.dumps(li) str_dic = json.dumps(dic) return HttpResponse(str_li,str_dic) #只能返回一個字符串。顯示不出來
2.使用JsonResponse
from django.http import JsonResponse def t_test(request): dic={"k1":jerd,"k2":"dandan"} return JsonResponse(dic)
默認只能傳字典,傳列表需要添加safe=False
return JsonResponse(li,safe=False)
Django中HttpResponse,JsonResponse和rest—framework中Response的區別
1.HttpResonse返回的是字符串
使用HttpResponse,ajax還需要進行json解析
#views.py return HttpResponse(json.dumps({"msg":"ok!"})) #index.html var data=json.parse(data) console.log(data.msg);
2.JsonResponse返回的是json數據
class JsonResponse(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None,**kwargs)
這個類是HttpRespon的子類,它主要和父類的區別在於:
1.它的默認Content-Type 被設置爲: application/json
2.第一個參數,data應該是一個字典類型,當 safe 這個參數被設置爲:False ,那data可以填入任何能被轉換爲JSON格式的對象,比如list, tuple, set。 默認的safe 參數是 True. 如果你傳入的data數據類型不是字典類型,那麼它就會拋出 TypeError的異常。
3.json_dumps_params參數是一個字典,它將調用json.dumps()方法並將字典中的參數傳入給該方法。
使用JsonResponse兩邊都不需要進行json的序列化與反序列化,ajax接受的直接是一個對象
#views.py from django.http import JsonResponse return JsonResponse({"msg":"ok!"}) #index.html console.log(data.msg);
3.Response按照指定的congtent-type渲染數據,並返回給客戶端
將未處理的內容通過內容協商來決定將數據以什麼形式返回給客戶端
class Response(SimpleTemplateResponse): def __init__(self, data=None, status=None, template_name=None, headers=None, exception=False, content_type=None):pass