Django视图系统(View)
Django视图系统(View)
一个视图函数(类),简称为视图,是一个简单的 Python 函数(类), 它接受 Web 请求并返回Web响应.响应可以是一张网页HTML内容, 一个重定向, 一个404错误,等,,,
视图放置在 项目 或者 项目的app 目录中 名字为: views.py 的文件中.
CBV和FBN
FBV
基于函数的视图. 在视图函数中通过对 request.method 的不同判断进而执行不同的代码.
例:
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.views.View
- 在类中定义和请求方法同的方法.
- urls.py 中注册视图的时候区别于FBV 如: 类名.as_view()
例:
from django.views import View
class AddClass(View):
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时,urls.py中也做对应的修改:
# urls.py中
url(r'^add_class/$', views.AddClass.as_view()),
给视图加装饰器
使用装饰器装饰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/")
Request对象和Response对象
request对象
作者:闫世成
出处:http://cnblogs.com/yanshicheng
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。如有问题或建议,请联系上述邮箱,非常感谢。

浙公网安备 33010602011771号