Django的View(视图):
一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应。
响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片。
无论视图本身包含什么逻辑,都要返回响应。代码写在哪里也无所谓,只要它在你当前项目目录下面。除此之外没有更多的要求了——可以说“没有什么神奇的地方”。为了将代码放在某处,大家约定成俗将视图放置在项目(project)或应用程序(app)目录中的名为views.py的文件中。
CBV和FBV:
FBV: (function based view)基于函数的视图;
CBV:(function based view)基于类的视图;
CBV写法:
from django.views import View class AddPublisher(View): def get(self, request): print('这个是get') return render(request, 'add_publisher.html') def post(self, request): print('这个是post') return render(request, 'add_publisher.html', {"err_name": add_name, 'err_msg': err_msg})
url中的使用:
url(r'^add_publisher/', views.AddPublisher.as_view()),
CBV简单的流程:
1. AddPublisher.as_view() ——》 view函数
2. 当请求到来的时候才执行view函数
1. 实例化AddPublisher ——》 self
2. self.request = request
3. 执行self.dispatch(request, *args, **kwargs)
1. 判断请求方式是否被允许
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
通过反射获取对应的方法
GET ——》 get
POST ——》 post
2. 执行获取到的方法 get(request,) 或者post(request,)
3. 得到HttpResponse对象,返回给self.dispatch
4. 得到HttpResponse对象,返回django处理
给视图增加装饰器:
FBV中增加装饰器;
因为 FBV本身就是一个函数, 所以跟给普通函数增加装饰器一样 示例:
def wrapper(func): def inner(*args, **kwargs): start_time = time.time() ret = func(*args, **kwargs) end_time = time.time() print("used:", end_time-start_time) return ret return inner # FBV版添加班级 @wrapper def add_class(request): if request.method == "POST": class_name = request.POST.get("class_name") models.Classes.objects.create(name=class_name) return redirect("/class_list/") return render(request, "add_class.html")
CBV中增加装饰器;
类中的方法与独立函数不完全相同,因此不能直接将函数装饰器应用于类中的方法 ,我们需要先将其转换为方法装饰器。
Django中提供了method_decorator装饰器用于将函数装饰器转换为方法装饰器。
示例:
# CBV版添加班级 from django.views import View from django.utils.decorators import method_decorator class AddClass(View): @method_decorator(wrapper) def get(self, request): return render(request, "add_class.html") def post(self, request): class_name = request.POST.get("class_name") models.Classes.objects.create(name=class_name) return redirect("/class_list/")
拓展:
# 使用CBV时要注意,请求过来后会先执行dispatch()这个方法,如果需要批量对具体的请求处理方法,如get,post等做一些操作的时候,这里我们可以手动改写dispatch方法,这个dispatch方法就和在FBV上加装饰器的效果一样。 class Login(View): def dispatch(self, request, *args, **kwargs): print('before') obj = super(Login,self).dispatch(request, *args, **kwargs) print('after') return obj def get(self,request): return render(request,'login.html') def post(self,request): print(request.POST.get('user')) return HttpResponse('Login.post')