(二)理解视图 View
上一节我们讲了 Django 是一个高度模块化的框架
具体来说,一个 Django 应用由多个子应用组成,我们一般称之为 App(注意不是我们常说的移动应用 APP,而是 Application)
而所有的 Django 应用都在 djangonews/settings.py 的 INSTALLEDAPPS 列表中定义

实现自定义 APP
python3 manage.py startapp news

news // news 应用目录
├── __init__.py // 初始化模块
├── admin.py // 后台管理配置
├── apps.py // 应用配置
├── migrations // 数据库迁移文件目录
│ └── __init__.py // 数据库迁移初始化模块
├── models.py // 数据模型
├── tests.py // 单元测试
└── views.py // 视图
可以看到一个目录下有很多的文件,这是因为 Django 始终坚持解耦的原则 —— 尽量减少代码之间的耦合,把不相关的代码拆成多个模块,让同一个模块具有内聚性
我们在 settings.py 中将 news 应用加入 INSTALLED_APPS 中

业务逻辑编写
通过访问 localhost:8000/admin 已经可以访问后台管理系统了(虽然会跳转到登录界面)
接下来,我们同样希望能够访问到刚才创建的 news 应用,因此,这一步中我们将:
- 在视图(View)中写一点业务逻辑
- 接入路由,使其能够被访问
Django 的路由系统
如果你对路由一直很迷惑,只需要记住路由的核心概念:决定"从哪里到哪里应该怎么走"的规则,本质都是"根据输入找到对应处理逻辑"。
Django 的路由系统是由全局路由和子应用路由组成。简单来说,根据用户输入的 URL,全局路由表进行匹配并选择正确的子应用路由,再由所选择的子应用路由匹配并选择正确的视图(View)如图:

example.com/apple/buy,然后全局路由根据 /apple/buy 先选择 apple 的路由表,再从 apple 路由表中根据 /buy 选择 /buy 路由,然后执行 /buy 对应的 BuyView 视图,返回给用户结果
编写第一个视图
对视图访问的流程大致了解之后,我们就可以开始动手了
首先打开 news/views.py,写一个简单的视图函数,返回一串 Hello World!
from django.http import HttpResponse
def index(request):
return HttpResponse('Hello World!')
上面这个 index 函数可以说是一个最简单的视图函数了,实际大部分应用的视图要比这复杂得多。Django 同时支持 基于函数的视图(FBV,Function-based View)和 基于类的视图(CBV,Class-based View),这里显然是 FBV,接收一个 request 请求对象作为参数,返回了一个 HttpResponse 对象
将视图接入路由
接着,我们要让路由系统能够访问到刚才写好的视图函数。因此先实现子应用 news 的路由表,创建 news/urls.py 文件,内容如下:
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
每一个 Django 路由表模块(urls.py)中都约定必须包含一个 urlpatterns 列表用来存放路由映射表。列表中每个元素是一个用 django.urls.path 函数封装好的路由映射,通常接收以下三个参数:
- route:必须,实际的访问路由; 空字符串等于 /,空路由
- view:必须,该路由将要访问的视图
- name:可选,该路由的名称,方便后续在模板中使用
我们将刚刚写好的 news 路由表接入全局路由表。由于我们希望新闻能够展示在首页(即通过 / 就能访问,无需 /news),因此 news 应用路由在全局路由中的 URL 是一个空字符串。在 django_news/urls.py 中修改,内容如下:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('news.urls')),
]
这里使用 django.urls.include 函数将 news 应用的路由表接入进来,并且 include 函数的参数是路由模块路径的字符串 news.urls,省去了手动 import 的麻烦
添加路由规则时顺序是很重要的,因为在尝试匹配时会按照从上到下的顺序进行,因此应该把最模糊的路由(即空路由)放在最下面。
如果你的开发服务器还在运行(如果没有可以再打开),访问 localhost:8000,就可以看到一串熟悉的字符了

总结
这一篇,主要讲解了一些 APP 的概念,以及路由的概念,以及如何编写一个视图并通过路由从而在网页进行体现
整体流程就是:news/view.py ——> news/urls.py ——> django_news/urls.py
愿诸君顺遂