三板斧
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()),