Django之视图层

视图函数必需要返回一个HttpResponse对象html

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.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')

FBV和CBV

视图函数并不必定就是函数,也能够是类,django的视图层由两种形式构成:FBV和CBV函数

FBV:基于函数的视图源码分析

CBV:基于类的视图post

CBV基本写法

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,

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

相关文章
相关标签/搜索