Django 视图

三板斧本质

django视图函数必须要返回一个HttpResponse对象

render、redirect内部是继承了HttpRespone类

JsonResponse

需求:给前端返回json格式数据
    
方式1:自己序列化
    res = json.dumps(d,ensure_ascii=False)
    return HttpResponse(res)

方式2:JsonResponse
    from django.http import JsonResponse
    def func1(request):
        d = {'user':'a','password':123}
        return JsonResponse(d)
    
    ps:额外参数补充
    json_dumps_params={'ensure_ascii':False}  # 返回值取消转义
    safe=False  # 允许输入除字典外的数据类型
    # JsonResponse返回的也是HttpResponse对象

FBV与CBV

FBV
	基于函数的视图
CBV
	基于类的视图
    
    
# CBV基本使用
	# view.py:
        from django.views import View
        class MyView(View):
            def get(self,request):
                return HttpResponse("get方法")
            def post(self,request):
                return HttpResponse("post方法")
	# urls.py:
    	url(r'^func',views.MyView.as_view())
        
        
"""为什么能够自动根据请求方法的不同执行不同的方法"""
1.突破口
	as_view()
2.CBV与FBV路由匹配本质
	url(r'^func4',views.MyView.as_view())
    # 等价  CBV路由配置本质跟FBV一样
    url(r'^func4',views.view)
3.源码
	   def as_view(cls, **initkwargs):
            def view(request, *args, **kwargs):
                self = cls(**initkwargs)  # self = MyView()  生成一个我们自己写的类的对象
                return self.dispatch(request, *args, **kwargs)
            return view
       def dispatch(self, request, *args, **kwargs):
        # 获取当前请求并判断是否属于正常的请求(8个)
        if request.method.lower() in self.http_method_names:
            # get请求  getattr(对象,'get')   handler = 我们自己写的get方法
            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
        else:
            handler = self.http_method_not_allowed
        return handler(request, *args, **kwargs)  # 执行我们写的get方法并返回该方法的返回值

cbv加装饰器

# cbv加装饰器可以加在类上:
@method_decorator(auth,name='get') #给get请求加装饰器

# 可以加在方法上
@method_decorator(auth)
def get(self, request, *args, **kwargs):
    pass

form表单上传文件

form表单上传文件注意事项
	1.method必须是post
    2.enctype参数修改为multipart/form-data
    
def func(request):
    if request.method == 'POST':
        print(request.POST)
        file_obj = request.FILES.get('myfile')
        print(file_obj.name)  # 获取文件名称
        with open(r'%s'%file_obj.name,'wb') as f:
            for chunks in file_obj.chunks():
                f.write(chunks)
    return render(request,'func.html')
posted @ 2021-04-12 10:18  最冷不过冬夜  阅读(41)  评论(0编辑  收藏  举报