Django框架之View.py(视图文件)
视图简介
视图层是Django处理请求的核心代码层,我们大多数Python代码都集中在这一层面。
它对外接收用户请求,对内调度模型层和模版层,统合数据库和前端,最后根据业务逻辑,将处理好的数据,与前端结合,返回给用户。视图层是真正的后端,是Python工程师的‘主营业务’。
视图就是每个创建的APP中的的view.py文件夹。我们处理数据的那些业务逻辑,就都存放(编辑)在这里。
Django的视图层包含下面一些主要内容:
- URL路由
- 视图函数
- 快捷方式
- 装饰器
- 请求与响应
- 类视图
- 文件上传
- CSV/PDF生成
- 内置中间件
注意:视图层应该包含视图文件(view.py)和路由文件(urls.py)两个系统组成。
一个最新建的Django APP ,新建的APP名称为(app001)如下:
一个简单的视图
from django.http import HttpResponse
from django.shortcuts import HttpResponse
import datetime
def current_datetime(request):
now = datetime.datetime.now()
html = "<html><body>It is now %s.</body></html>" % now
return HttpResponse(html)
让我们来逐行解释下上面的代码:
-
首先,我们从 django.http(或者django.shorcuts)模块导入了HttpResponse类,以及Python的datetime库。
索引上面的两个from引入语句的功能是一样的,只需要其中一条就可以了!!!!!
-
接着,我们定义了current_datetime函数。它就是视图函数。
-
每个视图函数都使用接收到的HttpRequest对象作为第一个参数,并且通常称之为request。
-
注意,视图函数的名称并不重要;不需要用一个统一的命名方式来命名,以便让Django识别它。我们将其命名为current_datetime,是因为这个名称能够比较准确地反映出它实现的功能(唯一性)。
-
这个视图会返回一个HttpResponse对象,其中包含生成的响应(HTML页面或者一个字符串)。
-
每个视图函数都负责返回一个对象,可以是HttpResponse对象,也可以render对象,还可以是redirect对象。
所以,我们可以将上面的from引入语句修改得全一点,如下:
from django.shortcuts import render, HttpResponse, redirect
在平时的开发中,我们也会称 render, HttpResponse, redirect 这三个为 “ 基础必配三件套 ” 。
注意,HttpResponse是一个类,而render和redirect是Django的内置函数!
Django使用请求和响应对象来通过系统传递状态。
当浏览器向服务端请求一个页面时,Django创建一个HttpRequest对象,该对象包含关于请求的元数据。然后,Django加载相应的视图,将这个HttpRequest对象作为第一个参数传递给视图函数。
每个视图负责返回一个HttpResponse对象给浏览器。
视图函数的前奏(FBV和CBV)
什么是FBV? 在视图文件里面编辑的时候,基于函数的形式来编辑业务逻辑的视图view,就叫做FBV (function base view)。
什么是CBV? 而在编辑业务逻辑的时候,基于类的形式来编辑业务逻辑的则是叫做CBV(class base view)。
下面用一个简单的例子来说明:
使用FBV写:
from django.shortcuts import render, HttpResponse, redirect
def back_hello(request):
return HttpResponse('大家好!')
使用CBV写:
from django.views import View # 基于类的形式来写试图上的业务逻辑的时候,定义的类需要 继承 django 中的View类 !!!!!!!
class BackHello(View):
def get(self, request):
return HttpResponse("get请求的时候!get大家好!")
def post(self, request):
return HttpResponse("post请求的时候!post大家好!")
注意:使用CBV形式的时候,urls.py上的路径与函数的对应关系,是与FBV不一样的,需要修改,如下:
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^test/', views.BackHello.as_view()),
]
# 可以看出,test/位置中的路径写法与FBV一样,时候后面的引入格式变成了:
# views.类名.as_view()。而CBV情况下是写为: views.函数名
# 注意:as_view(),这个是固定的!!!!