视图层必会三板斧、JsonResponse对象、视图层之FBV和CBV、CBV源码解剖

  • 视图层之必会三板斧

  • JsonResponse对象

  • 视图层之request对象获取文件

  • 视图层之FBV与CBV

  • CBV源码剖析(重要)

  • 模板层

视图层之必会三板斧

# 用来处理请求的视图函数都必须返回HttpResonse对象
   完全正确
    
# HttpResonse
class HttpResonse:
     pass
return HttpResonse()

image

# render
def render():
    return HttpResponse()
return render()

image

# redirect
def redirect():
    redirect_class = 类(祖先有个类是HttpResponse)
    return redirect_class()
return redirect()
'''多继承'''

image

JsonResponse对象

  • json模块
user_dict = {'name':'jason','age':18}
import json
user_json = json.dumps(user_dict)
return HttpResponse(user_json)

image

user_dict = {'name':'jason','age':18,'hobby':'起飞'}
import json
user_json = json.dumps(user_dict)
return HttpResponse(user_json)

'''出现乱码'''

image

ensure_ascii=False

image

  • JsonResponse对象
from django.http import JsonResponse
user_dict = {'name': 'jason', 'age': 18, 'hobby': '起飞'}
return JsonResponse(user_dict, json_dumps_params={'ensure_ascii': False})

image

ps:以后写代码很多时候可能需要参考源码及所学知识扩展功能
	class JsonResponse(HttpResponse):
        def __init__(self,data,json_dumps_params=None):
        		json.dumps(data,**json_dumps_params)
          
JsonResponse主要序列化字典 针对非字典的其他可以被序列化的数据需要修改safe参数为False

视图层之request对象获取文件

# form表单上传文件
form表单携带文件类型的数据需要做到以下几点

1.method必须是post

2.enctype必须修改为multipart/form-data
  	# 默认是application/x-www-form-urlencoded

image

3.django后端需要通过request.FILES获取文件类型的数据

image

视图层之FBV与CBV

FBV
     基于函数的视图
    def index(request):return HttpResponse对象
    
CBV
     基于类的视图
    from django import views
  	 class MyLoginView(views.View):
        def get(self, request):
            return HttpResponse('from CBV get function')

        def post(self, request):
            return HttpResponse('from CBV post function')
     
CBV路由匹配:
	path('login/', views.MyLoginView.as_view())
    """
 	如果请求方式是GET 则会自动执行类里面的get方法
 	如果请求方式是POST 则会自动执行类里面的post方法
 	"""

image

image

CBV源码解剖(重要)

# 切入点:路由匹配
path('login/', views.MyLoginView.as_view())
类名点名字(名字的查找问题)
类名点名字并加括号调用(静态方法、绑定给类的方法)
as_view 可能是普通的静态方法
as_view 可能是绑定给类的方法

# 独享查找属性的顺序
先从对象自身开始、再从产生对象的类、之后是各个父类
MyLoginView.as_view()
先从我们自己写的MyLoginView中查找
   没有再去父类Views中查找
    
# 函数名加括号执行优先级最高
项目一启动就会自动执行as_view方法
path('login/', views.view)  # CBV路由本质还是FBV

# 浏览器地址栏访问login路由需要执行view函数
产生我们自己编写类的对象
对象调用dispatch方法(注意查找顺序)

# 研究父类中的dispatch方法
获取当前请求方法并转小写 之后利用反射获取类中对应的方法并执行


class View:
     @classmethod
     def as_view(cls, **initkwargs):
        def view(request, *args, **kwargs):
            self = cls(**initkwargs)
            return self.dispatch(request, *args, **kwargs)
     def dispatch(self, request, *args, **kwargs):
         handler = getattr(self, request.method.lower())
         return handler(request, *args, **kwargs)

image

image

posted @ 2022-12-13 22:22  Super小赵  阅读(282)  评论(0编辑  收藏  举报
****************************************** 页脚Html代码 ******************************************