zoukankan      html  css  js  c++  java
  • 四、视图层

    一、HttpResponse

    1. 视图函数必须有一个返回值,且返回值数据类型必须是HttpResponse对象
    
    2. 三个HttpResponse对象
    
    	a. HttpResponse
    	b. render
    	c. redirect
    

    二、JsonResponse

    1. 通常前后端数据交互采用json格式字符串(字典)
    
    
    2. JsonResponse向前端传输字典
    
    	from django.http import JsonResponse
    	
    	
    	def index(request):
    	
    	    user_dict = {'name': 'byx', 'msg': '想放假'}
    	
    	    return JsonResponse(user_dict, json_dumps_params={'ensure_ascii': False})
    
    
    3. JsonResponse向前端传输其他数据类型
    
    	from django.http import JsonResponse
    	
    	
    	def index(request):
    	
    	    l = [1, 2, 3]
    	
    	    return JsonResponse(l, safe=False)
    

    三、FBV与CBV

    1. 定义
    
    	FBV:基于函数的视图
    	CBV:基于类的视图
    	
    2. CBV基本写法
    
    	a. 视图层
    	
    		from django.shortcuts import render, HttpResponse, redirect
    		from django.views import View
    		
    		
    		class Mylogin(View):
    		
    		    def get(self, request):
    		        print('我是MyLogin里面的get方法')
    		        return render(request, 'login.html')
    		
    		    def post(self, request):
    		        print('我是MyLogin里面的post方法')
    		        return HttpResponse('post')
    	
    	b. 路由层
    
    		urlpatterns = [
    		    url(r'^admin/', admin.site.urls),
    		    # FBV路由写法
    		    url(r'^index/', views.index),
    		    # CBV路由写法
    		    url(r'^login/', views.Mylogin.as_view()),
    		]
    
    3. CBV特点及源码内部原理
    
    	a. 特点
    		
    		自动根据不同请求方式执行不同方法
    	
    	b. 源码内部原理
    	
    		根据接收的request参数,用反射获取到对应的方法。
    	
    		# 如果想在视图函数执行之前做一些操作,可以在CBV中定义dispatch方法来拦截
    		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)
    		
    
    4. CBV加装饰器方法(装饰器‘outter’)
    
    	a. 直接写在函数上方
    	
    		from django.views import View
    		from django.utils.decorators import method_decorator
    		
    		
    		class Mylogin(View):
    		                                
    			@method_decorator(outter)
    			def get(self, request):
    				print('我是MyLogin里面的get方法')
    				return render(request, 'login.html')
    		                        
    			def post(self, request):
    				print('我是MyLogin里面的post方法')
    				return HttpResponse('post')
    		
    	
    	b. 写在类上方指定给某个方法装
    	
    		from django.views import View
    		from django.utils.decorators import method_decorator
    		
    		
    		@method_decorator(outter, name='post')
    		class Mylogin(View):
    		                                 
    		        def get(self, request):
    		                print('我是MyLogin里面的get方法')
    		                return render(request, 'login.html')
    		                        
    		        def post(self, request):
    		                print('我是MyLogin里面的post方法')
    		                return HttpResponse('post')
    		
    	c. 给dispatch方法装
    	
    		from django.views import View
    		from django.utils.decorators import method_decorator
    		
    		
    		@method_decorator(outter, name='dispatch')
    		class Mylogin(View):
    		        
    		        def dispatch(self, request, *args, **kwargs):
    		                return super().dispatch(request, *args, **kwargs)
    		        
    		        def get(self, request):
    		                print('我是MyLogin里面的get方法')
    		                return render(request, 'login.html')
    		                        
    		        def post(self, request):
    		                print('我是MyLogin里面的post方法')
    		                return HttpResponse('post')
  • 相关阅读:
    企业如何搭建数据分析平台
    如何查看Android设备上的分区信息
    从传统企业谈大数据的战略意义
    金融行业的BI应用分析
    Android 5.x 权限问题解决方法
    unity使用ugui自制调色面板
    手机模式及分区
    高通8x12平台开机画面制作工具
    Unity插件
    Android开发小问题集
  • 原文地址:https://www.cnblogs.com/binyuanxiang/p/12052199.html
Copyright © 2011-2022 走看看