三板斧
HttpResponse, 返回字符串類型render, 返回html頁面,而且在返回給瀏覽器之前,可以給html文件傳值redirect 重定向
總結:視圖函數必須返回一個HttpResponse對象, 查看源代碼能發現。
?
JsonResponse對象
json用途:
前后端過渡,實現跨語言傳遞數據。
普通方式返回json
data = {"name": "小黑", "age": 18}data2 = [11, 22, 33, 44]import json# data_str = json.dumps(data2) # 把data序列化成json格式的字符串# return HttpResponse(data_str)#ensure_ascii=False 不會自動轉碼data_str = json.dumps(data,ensure_asrue=False) # 把data序列化成json格式的字符串return HttpResponse(data_str)
?JsonResponse
from django.http import JsonResponse#默認是字典。列表序列化,需要設置參數safe=Falsereturn JsonResponse(data2, safe=False)#讀源碼,加參數。 **表示打散字典,然后分配=return JsonResponse(data, json_dumps_params={'ensure_asrue=False':False})
?
form表單上傳文件,及后端處理
method="post" enctype="multipart/form-data"
<form action="/upload/" method="post" enctype="multipart/form-data"><input type="file" name="upload_file"><input type="submit" value="開始上傳">
</form>
# 從請求的FILES中獲取上傳文件的文件名,file為頁面上type=files類型input的name屬性值
filename = request.FILES["upload_file"].name#或者
file_obj=request.FILES.get('upload_file')
filename=file_obj.namewith open(filename, "wb") as f:# 從上傳的文件對象中,一行一行讀取for i in request.file_obj.chunks():# 寫入本地文件f.write(i)
?
request 對象方法
request.method
request.POST
request.GET
request.FILESrequest.path #/app01/test/
#獲取完整路徑
request.get_full_path() #/app01/test/?filename=abcrequest.path_info #/app01/test/#原生瀏覽器發送過來的二進制數據。
request.body
?
FBV與CBV
CBV
能夠根據請求方式不同,匹配到不同的方法執行。
from django.views import View
# CBV版 添加新的出版社
class AddPublisher(View):def get(self, request):print(request.path_info)print(request.body)print("=" * 120)return render(request, "add_publisher.html")def post(self, request):print(request.body)print("=" * 120)new_name = request.POST.get("publisher_name", None)if new_name:# 通過ORM去數據庫里新建一條記錄models.Publisher.objects.create(name=new_name)# 引導用戶訪問出版社列表頁,查看是否添加成功 --> 跳轉return redirect("/publisher_list/")else:error_msg = "出版社名字不能為空!"return render(request, "add_publisher.html", {"error": error_msg})
url(r'^add_publisher/', views.AddPublisher.as_view()),
?
?
?
?
?