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,

看源码发现是绑定给类的方法。下面是源码分析

posted @ 2020-01-06 20:59  Hank·Paul  阅读(261)  评论(0编辑  收藏  举报