《老鸟python 系列》视频上线了,全网稀缺资源,涵盖python人工智能教程,爬虫教程,web教程,数据分析教程以及界面库和服务器教程,以及各个方向的主流实用项目,手把手带你从零开始进阶高手之路!点击 链接 查看详情

第二个视图:动态内容

阅读:475520861    分享到

我们的 Hello world 视图是用来演示基本的 Django 是如何工作的,但是它不是一个动态网页的例子,因为网页的内容一直是一样的. 每次去查看 /hello/,你将会看到相同的内容,它类似一个静态 HTML 文件。

动态视图

我们的第二个视图,将更多的放些动态的东西例如当前日期和时间显示在网页上,这将非常好,简单的下一步,因为它不引入了数据库或者任何用户的输入,仅仅是输出显示你的服务器的内部时钟。它仅仅有限度的比 Hello world 刺激一些,但是它将演示一些新的概念。

这个视图需要做两件事情:计算当前日期和时间,并返回包含这些值的 HttpResponse 如果你对 python 很有经验,那肯定知道在 python 中需要利用 datetime 模块去计算时间,下面演示如何去使用它:

>>> import datetime
>>> now = datetime.datetime.now()
>>> now
datetime.datetime(2008, 12, 13, 14, 9, 39, 2731)
>>> print now
2020-03-13 14:09:39.002731

以上代码很简单,并没有涉及 Django。它仅仅是 Python 代码。需要强调的是,你应该意识到哪些是纯 Python 代码,哪些是 Django 特性代码。(见上)因为你学习了 Django,希望你能将 Django 的知识应用在那些不一定需要使用 Django 的项目上。

为了让 Django 视图显示当前日期和时间,我们仅需要把语句:datetime.datetime.now() 放入视图函数,然后返回一个 HttpResponse 对象即可。代码如下:

from django.http 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)

正如我们的 hello 函数一样,这个函数也保存在 view.py 中。为了简洁,上面我们隐藏了 hello 函数。下面是完整的 view.py 文件内容:

from django.http import HttpResponse
import datetime

def hello(request):
    return HttpResponse("Hello world")

def current_datetime(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now %s.</body></html>" % now
    return HttpResponse(html)

(从现在开始,如非必要,本文不再重复列出先前的代码。你应该懂得识别哪些是新代码,哪些是先前的。)(见上)

让我们分析一下改动后的 views.py:

在文件顶端,我们添加了一条语句:import datetime。这样就可以计算日期了。函数中的第一行代码计算当前日期和时间,并以 datetime.datetime 对象的形式保存为局部变量 now 。函数的第二行代码用 Python 的格式化字符串(format-string)功能构造了一段 HTML 响应。 字符串中的 %s 是占位符,字符串后面的百分号表示用它后面的变量 now 的值来代替 %s。变量 %s 是一个 datetime.datetime 对象。它虽然不是一个字符串,但是 %s(格式化字符串)会把它转换成字符串,如:2020-12-13 14:09:39.002731。这将导致 HTML 的输出字符串为:It is now 2020-12-13 14:09:39.002731。(目前 HTML 是有错误的,但我们这样做是为了保持例子的简短。)最后,正如我们刚才写的 hello 函数一样,视图返回一个 HttpResponse 对象,它包含生成的响应。

添加上述代码之后,还要在 urls.py 中添加 URL 模式,以告诉 Django 由哪一个URL来处理这个视图。用 /time/ 之类的字眼易于理解:

from django.contrib import admin
from django.urls import path
from django.urls import re_path
from mysite.views import hello, current_datetime

urlpatterns =[
    path('admin/', admin.site.urls),
    re_path('^hello/$', hello),
    re_path('^time/$', current_datetime),
]

这里,我们修改了两个地方。首先,在顶部导入 current_datetime 函数;其次,也是比较重要的:添加 URL 模式来映射 URL 中的 /time/ 和新视图。理解了么?

写好视图并且更新 URLconf 之后,运行命令 python manage.py runserver 以启动服务,在浏览器中输入http://127.0.0.1:8000/time/。 你将看到当前的日期和时间。

Django 时区

视乎你的机器,显示的日期与时间可能和实际的相差几个小时。这是因为 Django 是有时区意识的,并且默认时区为 America/Chicago。(它必须有个值,它的默认值是 Django 的诞生地:美国/芝加哥)如果你处在别的时区,你需要在 settings.py 文件中更改这个值。请参见它里面的注释,以获得最新世界时区列表。

URL 配置和松耦合

现在是好时机来指出 Django 和 URL 配置背后的哲学:松耦合 原则。简单的说,松耦合是一个重要的保证互换性的软件开发方法。

Django 的 URL 配置就是一个很好的例子。在 Django 的应用程序中,URL 的定义和视图函数之间是松耦合的,换句话说,决定 URL 返回哪个视图函数和实现这个视图函数是在两个不同的地方。这使得开发人员可以修改一块而不会影响另一块。

例如,考虑一下 current_datetime 视图。 如果我们想把它的 URL 从原来的 /time/ 改变到 /currenttime/,我们只需要快速的修改一下 URL 配置即可,不用担心这个函数的内部实现。同样的,如果我们想要修改这个函数的内部实现也不用担心会影响到对应的 URL。

此外,如果我们想要输出这个函数到 一些 URL, 我们只需要修改 URL 配置而不用去改动视图的代码。在这个例子里,current_datetime 被两个 URL 使用。这是一个故弄玄虚的例子,但这个方法迟早会用得上。

urlpatterns =[
    path('admin/', admin.site.urls),
    re_path('^hello/$', hello),
    re_path('^time/$', current_datetime),
    re_path('^another-time-page/$', current_datetime),
]

URLconf 和视图是松耦合的。我们将在本书中继续给出这一重要哲学的相关例子。


如果以上内容对您有帮助,请老板用微信扫一下赞赏码,赞赏后加微信号 birdpython 领取免费视频。


登录后评论