首页 > 其他分享 >django 04 视图层

django 04 视图层

时间:2022-12-13 21:47:26浏览次数:64  
标签:return 04 request 视图 django json HttpResponse def view

视图层三剑客(render,HttpResponse,redirect)

# 1.用于处理请求的视图函数都必须返回HttpResponse对象
    """
    render,HttpResponse的底层都是HttpResponse
    redirect则是因为在其继承的祖先类中存在HttpResponse
    """
    render源码:
         def render(request, template_name, context=None, content_type=None, status=None, using=None):
              return HttpResponse(content, content_type, status)

    HttpRespon:
         本身就是HttpResponse对象
    
    redircect源码:
         def redirect(to, *args, permanent=False, **kwargs):
              redirect_class = HttpResponsePermanentRedirect if permanent else HttpResponseRedirect
              return redirect_class(resolve_url(to, *args, **kwargs))
          """redirect_class,是三元表达式,permanent默认为False,执行后面条件"""
      - HttpResponseRedirect类内: 
         class HttpResponseRedirect(HttpResponseRedirectBase): 
      - HttpResponseRedirectBase类内:
         class HttpResponseRedirectBase(HttpResponse):
         """可以看到最后继承的祖先是HttpResponse类"""
    

JsonResponse对象

# 1.导入:
     from django.http import JsonResponse

# 2.将字典以json格式的字符串返回出来
     user_dict = {'name': 'jason老师', 'pwd': 123, 'hobby': ['read', 'run', 'music']}

     - 方法一:
     json_str = json.dumps(user_dict,ensure_ascii=False)
         return HttpResponse(json_str)
         return JsonResponse(user_dict)
  
     - 方法二:
     from django.http import JsonResponse # 导入该模块
     JsonResponse(user_dict, json_dumps_params={'ensure_ascii':False})
     # 序列化非字典类型的数据还需要指定safe参数为False
      
# 3.JsonResponse模块的源代码:
     class JsonResponse(HttpResponse):
     def __init__(self, data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None, **kwargs):
         if json_dumps_params is None:
             json_dumps_params = {}
         data = json.dumps(data, cls=encoder, **json_dumps_params) 

request对象获取文件

# 1.form表单携带文件类型数据条件
   条件1: method必须是post
   条件2: enctype必须是multipart/form-data

# 2.request对象方法
   request.method         该方法可以获取请求方式(GET/POST)纯大写
   # POST请求:
   request.POST           获取POST请求发送来的普通数据(不包含文件) 
                          # 获取到的值是一个字典形式的数据(键必须存在)
   request.POST.get()     不指定,默认只获取字典里面列表中最后一个数据
   request.POST.getlist() 默认获取键对应的整个列表,有几个拿几个,也可以在括号内填写索引值
   # GET请求:
   request.GET            获取URL后面携带的非敏感数据
   request.GET.get()      不指定,默认只获取列表中的是最后一个
   request.GET.getlist()  获取键对应的整个列表,有几个拿几个

视图层FBV与CBV

# 1.FBV:基于函数的视图
    def index(request):
         return HttpResponse对象
    路由:
    path('index/', views.index)

# 2.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')
    路由: 
        path('login/', views.MyLoginview.as_view())
    
    """CBV会根据请求方法的不同自动去匹配类中对应的方法去执行"""

CBV源码

# 1.从CBV路由开始剖析源码
    path('login/', views.MyLoginView.as_view())
       -1.类名点名字(名字的查找问题)
       -2.类名点名字并加括号调用(静态方法,绑定给类的方法)

# 2.函数名加括号执行优先级最高,项目一启动就会自动执行as_view方法
     path('login/',views.view)      # CBV路由本质就是FBV
      
# 3.浏览器访问login路由需要执行view函数
       -1.产生自己编写的类的对象
       -2.对象调用dispatch方法
       -3.研究父类中的dispatch方法

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

# 5.源码
      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)

 

标签:return,04,request,视图,django,json,HttpResponse,def,view
From: https://www.cnblogs.com/juzijunjun/p/16979044.html

相关文章