把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end
旋转立方体
旋转立方体end

四、视图层

一、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')
posted @ 2019-12-17 00:04  远翔、  阅读(128)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end