ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

day06 视图层

2021-11-29 10:31:54  阅读:210  来源: 互联网

标签:return self request day06 视图 HttpResponse def view


day06 视图层

今日内容

  • 视图层

    小白必会三板斧
    JsonResponse
    form表单发送文件
    
  • FBV与CBV

    FBV基于函数的视图
    CBV基于类的视图
    
  • 模板层

    模板语法的传值
    模板语法之过滤器
    模板语法之标签
    自定义过滤器、标签、inclusion_tag
    模板的继承与导入
    

HttpResponse对象

# 视图函数必须返回一个HttpResponse对象
为什么这么说呢?

HttpResponse
	class HttpResponse:   # 直接定义一个HttpResponse类
        pass
    
render
	def render(...):
        return HttpResponse(...)  # 返回一个HttpResponse类

redirect
	def redirect(...)
    	# redirect_class是继承HttpResponse子类
    	return redirect_class(...)

JsonResponse

# 向前端返回一个json格式字符串的两种方式

第一种方式:
    import json
    dic = {'name':'meng','age':18,'gender':'男'}
    json_str = json.dumps(dic,ensure_ascii=False)  # json格式默认会对中文字符进行转码,加上参数不转码
    return HttpResponse(json_str)

第二种方式:
    from django.http import JsonResponse
    def index(request):
        dic = {'name':'meng','age':18,'gender':'男'}
        return JsonResponse(dic,json_dumps_params={'ensure_ascii':False})
		# 由源代码中**kwargs打散成 ensure_ascii=False
        
        list = [1,2,3,4,5]   
        return JsonResponse(list,safe=False)  # 要想传入列表,必须把safe设置False

# 注:只有json格式打印出来才会是""双引号

form表单文件上传

想要form表单提交文件的前提有两个:
1.method必须是post
2.enctype参数必须是multipart/form-data
	request.POST无法获取到文件类型的数据
    request.FILES获取文件类型的数据  # 使用这个获取出普通数据外的数据
    
后端:
def index(request):
    if request.method == 'POST':
        # print(request.POST)
        # print(request.FILES)   # <MultiValueDict: {'file': [<InMemoryUploadedFile: 生命周期流程图.png (image/png)>]}>
        file_obj = request.FILES.get('file')  # 与request.POST.get('file') 一个意思
        print(file_obj.name)
        with open(file_obj.name,'wb') as f:
            for line in file_obj:
                f.write(line)
    return render(request,'index.html')

前端:
	<form action="" method="post" enctype="multipart/form-data">
	<input type="file" name="file" >   # 不加multiple参数只能选一个
	<input type="file" name="file" multiple>  # 加上可以选多个上传

FBV与CBV

# CBV基于类的视图(Class base view)和FBV基于函数的视图(Function base view)

FBV:基于函数的视图
	# FBV
    url(r'^index/',views.index),
    def index(request):
        pass

CBV:基于类的视图函数
    # CBV
    url(r'^login/',views.Mylogin.as_view())  # as_view经过变形之后返回view,加上括号调用
    
    from django.views import View
    class Mylogin(View):
        def get(self,request):
            return HttpResponse('get请求')

        def post(self,request):
            return HttpResponse('post请求')
# CBV会自动判断当前请求方法并自动匹配类中的方法执行

对象查找属性或方法的顺序(***)

# 对象查找属性或方法的顺序
	永远都是先从自己身上找
	然后去产生对象的类中找
	再去类的父类中找 如果都没有才会报错

CBV源码剖析

"""
函数名或者方法名遇到括号执行优先级最高

对象查找属性或方法的顺序
	永远都是先从自己身上找
	然后去产生对象的类中找
	再去类的父类中找 如果都没有才会报错

闭包函数
	定义在函数内部并且使用了外层函数名称空间中的名字
"""
# 其实FBV与CBV在路由匹配上本质其实是一样的,都是正则表达式对应函数名



# 经过变形后:url(r'^login',views.view) ,看源码发现返回view
# 当匹配到login,自动调用view加括号执行
url(r'^login/',views.Mylogin.as_view())  
   
源代码:
    def as_view(cls, **initkwargs):
         def view(request, *args, **kwargs):
            # cls使我们自定义的类  MyLogin
            self = cls(**initkwargs)  # 产生一个MyLogin类的对象  obj 
            return self.dispatch(request, *args, **kwargs)   # 调用disoatch函数
         return view
        
    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)  # 执行这个方法
    
# 用自己的话说:
    1、路由匹配url调用了一个绑定给类的as_view()函数
    2、as_view()里面定义了一个view函数,调用了dispatch函数
    3、在dispatch函数中判断发来的请求方式是否在 http_method_names变量名
    4、在的话,用getattr方法去自己定义的类产生的对象寻找
    5、在自己定义的类找的对应的请求方法,并执行相应请求下面的代码
    class Mylogin(View):
    def get(self,request):
        return HttpResponse('get请求')

    def post(self,request):
        return HttpResponse('post请求')

标签:return,self,request,day06,视图,HttpResponse,def,view
来源: https://www.cnblogs.com/1069943893com/p/15618231.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有