视图函数必需要返回一个HttpResponse对象html
向前端返回Json格式的字符串前端
from django.http import JsonResponse
import json def xxx(request): user_dict = {'username':'你好帅,我好喜欢!','password':'123'} # json_str = json.dumps(user_dict,ensure_ascii=False)
# return HttpResponse(json_str)
l = [1,2,3,4,5,6,7,8,9,] # return JsonResponse(user_dict,json_dumps_params={'ensure_ascii':False})
return JsonResponse(l,safe=False) # 序列化非字典格式数据 须要将safe改成False
upload.htmldjango
view.pyjson
def upload(request): if request.method == 'POST': #获取用户上传的文件数据
print(request.FILES) file_obj = request.FILES.get('myfile') #能够把file_obj看做是一个文件句柄
print(file_obj.name) #获取文件名
with open(file_obj.name,'wb')as f: for line in file_obj: f.write(line) return render(request,'upload.html')
视图函数并不必定就是函数,也能够是类,django的视图层由两种形式构成:FBV和CBV函数
FBV:基于函数的视图源码分析
CBV:基于类的视图post
urls.pyurl
url(r'^login/', views.MyLogin.as_view())
views.pyspa
from django.views import View class MyLogin(View): def get(self,request): return render(request,'login.html') def post(self,request): return HttpResponse('我是类里面的post方法')
# 咱们会发现,朝login提交get请求会自动执行MyLogin里面的get方法
# 而提交post请求会自动执行MyLogin里面的post方法
基于以上发现,咱们想想,为何MyLogin针对不一样的请求方法可以自动执行对应的方法,咱们能够来看下源码。研究源码的突破口就是code
url(r'^login/', views.MyLogin.as_view())
#FBV与CBV在路由匹配上本质是同样的,都是路由与函数内存地址的对应关系
猜测,as_view要么是类里面定义的普通函数 @staticmethod
要么是类里面定义的绑定给类的方法 @classmethod,
看源码发现是绑定给类的方法。下面是源码分析