Django之视图层
视图函数必须要返回一个HttpResponse对象
JsonResponse对象
向前端返回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
Form表单上传文件
upload.html
view.py
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')
FBV和CBV
视图函数并不一定就是函数,也可以是类,django的视图层由两种形式构成:FBV和CBV
FBV:基于函数的视图
CBV:基于类的视图
CBV基本写法
urls.py
url(r'^login/', views.MyLogin.as_view())
views.py
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针对不同的请求方法能够自动执行对应的方法,我们可以来看下源码。研究源码的突破口就是
url(r'^login/', views.MyLogin.as_view())
#FBV与CBV在路由匹配上本质是一样的,都是路由与函数内存地址的对应关系
猜想,as_view要么是类里面定义的普通函数 @staticmethod
要么是类里面定义的绑定给类的方法 @classmethod,
看源码发现是绑定给类的方法。下面是源码分析