视图层

程咬金的三板斧

  • HttpResponse
    返回字符串类型
  • render
    返回html页面 并且在返回给浏览器之前还可以给html文件传值
  • redirect
    重定向

render简单内部原理



	from django.template import Template,Context
    res = Template('<h1>{{ user }}</h1>')
    con = Context({'user':{'username':'jason','password':123}})
    ret = res.render(con)
    print(ret)
    return HttpResponse(ret)

JsonResponse对象

JsonResponse是HttpResponse的子类,用来生成JSON编码的响应

def ab_json(request):
    user_dic = {'username':'zc你好', 'password': '123'}
    
    """这里的汉字在页面上显示的是编码字符,需要转成汉字,要去到JsonResponse查看源码,找到解决方案"""
    # return JsonResponse(user_dic,json_dumps_params={'ensure_ascii':False})
    l=[111,222,333]
    return JsonResponse(l,safe=False)
	"""
	在页面显示列表会报错
	In order to allow non-dict objects to be serialized set the safe parameter to False.
	默认只能序列化字典,序列化其他的需要safa参数
	
	"""

request对象方法

  • path_info 返回用户访问url,不包括域名

  • method 请求中使用的HTTP方法的字符串表示,全大写表示。

  • GET 包含所有HTTP GET参数的类字典对象

  • POST 包含所有HTTP POST参数的类字典对象

  • body 请求体,byte类型 request.POST的数据就是从body里面提取到的

form表单上传文件

form 表单上传文件method必须指定post,enctype必须换成formdata

def ab_file(request):
    if request.method == 'POST':
        file_obj = request.FILES.get('file')
        with open(file_obj.name,'wb') as f:
            for line in file_obj:
                f.write(line)

    return render(request,'form.html')

<form action="" method="post" enctype="multipart/form-data">
    <p>username:<input type="text" name="username"></p>
    <p>file:<input type="file" name="file"></p>
    <input type="submit">
</form>

FBV和CBV

CBV: 路由
     	url(r'^login/',views.MyLogin.as_view())
     视图:
    
		from django.views import View


		class MyLogin(View):
    	def get(self,request):
        return render(request,'form.html')

    	def post(self,request):
        return HttpResponse('post方法')

CBV和FBV都有自己的特点,CBV能够直接根据请求的方式的不同直接匹配到对应的方法执行
CBV源码解析

  • 如何寻找突破口呢,答案在url里面,在url里面的url(r'^login/',views.MyLogin.as_view())MyLogin.as_view()这个相当于对象的实例化,当我们点进去as_view是一个类方法,这个就是和FBV形式一致
  • 看到里面的as_view是一个闭包函数内部实例化了MyLogin对象,就是处理匹配该url的一个对象,调用dispatch方法
  • 该对象的没有dispatch方法,按照队形属性查找顺序,最后找到父类viewdispatch,我们在内部假如定义了dispatch,此时的view会被覆盖,dispatch 采用反射的,根据请求方式的不同,动态匹配到对象的get方法,或post方法
@classonlymethod
def as_view(cls, **initkwargs):
    
    def view(request, *args, **kwargs):
        self = cls(**initkwargs) 
       
        return self.dispatch(request, *args, **kwargs)
     
    return view
  
	# CBV的精髓
def dispatch(self, request, *args, **kwargs):
   
    if request.method.lower() in self.http_method_names:
        handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
 
    else:
        handler = self.http_method_not_allowed
    return handler(request, *args, **kwargs)
  
posted @ 2020-05-27 17:00  小子,你摊上事了  阅读(94)  评论(0编辑  收藏  举报