0
点赞
收藏
分享

微信扫一扫

python应用篇之Web应用程序——Django入门(完结)


前言

  ​​上篇文章​​我们给大家介绍了Django应用程序的创建、模型的定义与激活、Django管理网站、Entry模型的定义与迁移;最后又向管理网站注册Entry以及Django Shell的相关知识的简介。本文接着给大家介绍Django的相关内容。本文之后,我们Django的全部内容就已经全部介绍完毕。首先给大家介绍创建网页:学习笔记主页。

一、创建网页:学习笔记主页

  使用Django创建网页的过程通常分三个阶段:定义URL、编写视图和编写模块。首先,你必须定义URL模式。URL模式描述了URL是如何设计的,让Django知道如何将浏览器请求与网站URL匹配,以确定返回哪个网站。

  每个URL都被映射到特定的视图——视图函数获取并处理网页所需的数据。视图函数通常调用一个模板,后者生成浏览器能够理解的网页。为明白其中的工作原理,我们来创建学习笔记的主页。我们将定义该主页的URL、编写其视图函数并创建一个简单的模板。

  鉴于我们只是要确保“学习笔记”按要求的那样工作,我们将暂时让这个网页尽可能简单。Web应用程序能够正常运行后,设置样式可使其更有趣,但中看不中用的应用程序毫无意义。就目前而言,主页只显示标题和简单的描述。

1、映射URL

  用户通过在浏览器中输入URL以及单击链接来请求网页,因此,我们需要确定项目需要哪些UTL。主页的URL最为重要,它是用户用来访问项目的基础URL。当前,基础URL,返回默认的Django网站,让我们知道正确地建立了项目。我们将修改这一点,将这个基础URL映射到“学习笔记”的主页。

  打开项目主文件夹​​learning_log​​中的文件​​urls.py​​,我们将看到如下的代码:

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
]

  前两行导入为了项目和管理网站管理URL的函数和模块。这个文件的主体定义了变量​​urlpatterns​​。在这个针对整个项目的​​urls.py​​文件中,变量​​urlpatterns​​包含了项目中的应用程序​​URL​​。最后的代码包含模块​​admin.site.urls​​,该模块定义了可在管理网站中请求所有URL。具体如下:

python应用篇之Web应用程序——Django入门(完结)_Python

  我们在刚才的文件中好需要添加包含​​learning_logs​​的URL,具体实现如下:

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'', include('learning_logs.urls', namespace='learning_logs')),
]

  我们首先添加了一行代码包含模块​​learning_logs.urls​​。这行代码包含实参​​namespace​​,让我们能够将​​learning_logs​​的URL同项目中的其他URL区分开来,这在项目扩展时很有帮助。

  默认的​​urls.py​​包含在​​learnng_log​​中,现在我们需要在文件夹​​learning_logs​​中创建另一个​​urls.py​​文件,具体实现如下:

"""定义learning_logs的URL模型"""
from django.conf.urls import url
from . import views
urlpatterns = [
# 主页
url(r'^$', views.index, name='index'),
]

  为弄清楚当前位于哪个​​urls.py​​文件中,我们在这个文件开头添加了一个文档字符串。接下来,我们导入了函数​​url​​,因为我们需要使用它来将URL映射到视图。我们还导入了模块​​views​​,其中的句点让Python从当前的​​urls.py​​模块所在的文件夹中导入视图。在这个模块中,变量​​urlpatterns​​是一个列表,包含可在应用程序​​learning_logs​​中请求的网页。

  实际的​​URL​​模式是一个对函数​​url()​​的调用,这个函数接受三个实参。第一个是一个正则表达式。Django在​​urlpatterns​​中查找与请求的​​url​​字符串匹配的正则表达式,因此正则表达式定义了Django可查找的模式。

  我们来看看正则表达式​​r'^$'​​。其中的r让Python将接下来的字符串为原始字符串,而引号告诉Python正则表达式始于和终于何处。脱字符(^)让Python查看字符串的开头,而美元符号让Python查看字符串的末尾。总体而言,这个正则表达式让Python查看开头和末尾之间没有任何东西的URL。Python忽略项目的基础URL,因此这个正则表达式与基础URL匹配。其他URL都与这个正则表达式不匹配,如果请求的URL不与任何URL模式匹配,Django将返回一个错误的页面。

  ​​url()​​的第二个实参指定了要调用的视图函数。请求的url与前述正则表达式匹配时,Django将调用​​view.index​​。第三个实参将这个URL模式的名称指定为index,让我们能够在代码的其他地方引用它。每当需要提供到这个主页的链接时,我们都将使用这个名称,而不编写URL。

  这里续要注意的是:​​正则表达式​​通常被称为​​regex​​,几乎每种编程语言都使用它。它们的用途多得难以置信,但需要经过一定的练习才可以熟悉。因此,我们在本项目中会用大量的这种正则表达式的。

2、编写视图

  视图函数接受请求中的信息,准备好生成网页所需要的数据,再将这些数据发送给浏览器——这通常是使用定义了网页是什么样的模板实现的。

  ​​learnings_log​​中的文件​​views.py​​是我们执行命令​​python manage.py startapp​​时自动生成的,当前其内容如下:

from django.shortcuts import render

# 在这里创建视图

  当你,这个文件只导入函数​​render()​​,它根据视图提供的数据渲染响应。下面的代码演示了解如何为主页编写视图,具体实现如下:

from django.shortcuts import render
def index(request):
"""学习笔记的主页"""
return render(request, 'learning_logs/index.html')

  URL请求与我们刚才定义的模式匹配时,Django将在文件​​views.py​​​中查找函数​​index()​​​,再将请求对象传递给这个视图函数。在这里,我们不需要产后护理任何数据,因此这个函数只包含调用​​render()​​​的代码。这里向函数​​render()​​提供了两个实参:原始请求对象以及一个可用于创建网页的模板。接下来我们就实现编写这个模板。

3、编写模板

  模板定义了网页的结构。模板指定了网页是什么样的,而每当网页被请求时,Django将填入了相关的数据。模板让我们能够访问视图提供的任何数据。我们的主页视图没有提供任何的数据,因此,相应的模板非常简单。

  在这个文件夹​​learning_logs​​中新建一个文件夹,并将其命名为​​templates​​。在文件夹templates中,再新建一个文件夹,并将其命名为​​learning_logs​​,看到这里的读者相信会有一个问题:那就是看起来这波操作有点多余啊,毕竟我们在文件夹learning_logs中创建了文件夹templates,又在这个文件夹中创建了文件夹learning_logs,但是其实不然,这里建立了Django能够明确解读的结构,即便是项目很大,包含很多应用程序亦是如此。在最里面的文件夹learning_logs中,新建一个文件,其命名为​​index.html​​,具体的文件目录呈现如下:

python应用篇之Web应用程序——Django入门(完结)_Python开发_02

  然后再到这个文件中编写如下的代码:

<p>Learning Log</p>
<p>Learning Log helps you keep track of your learning, for any topic you're learning about.</p>

  这个文件非常简单。对于不熟悉HTML的读者,这里给大家解释一下所用到的标签,其实就是一个前端的语言;标签p与/p就是标识段落;标签p指出了段落的开头位置,/p指出了段落的结束位置;这里定义了两个段落:第一个充当标题,第二个阐述了用户可以使用“学习笔记”来做些什么。

  现在,如果我们请求这个项目的URL,将看到刚才创建的网页,而不是默认的Django网页。Django接受请求的URL,发现该URL与模式​​r'^$'​​匹配,因此,调用函数​​view.index()​​,这将使用​​index.html​​包含的模板来渲染网页,具体执行结果如下:

python应用篇之Web应用程序——Django入门(完结)_Django_03

  创建网页的过程看起来很复杂,但将URL、视图和模板分离的效果实际上很好。这让我们能够分别考虑项目的不同方面,且在项目很大时,让各个参与者可关注于其最擅长的方面。例如,数据库专家专注于模型,程序员可专注于视图代码,而web设计人员可专注于模板。

二、创建其他网页

  制定创建网页的流程后,可以开始扩充我们的学习笔记的项目了。我们将创建两个显示数据的网页,其中一个列出所有的主题,另一个显示特定主题的所有条目。对于每个网页,我们都将指定URL模式,编写一个视图函数,并编写一个模板。但这样做之前,我们首先创建一个父模板,项目中的其他模板都将继承它。

1、模板继承

  创建网站时,几乎都有一些所有网页都将包含的元素。在这种情况下,可编写一个包含通用元素的父模板,并让每个网页都继承这个模板,而不必在每个网页中重复定义这些通用元素。这种方法能让你专注于开发每个网页的独特方面,还能让修改项目的整体外观容易得多。

   1、父模板

  我们首先创建一个名为​​base.html​​的模板,并将其存储在​​index.html​​所在的目录中。这个文件包含所有页面都有的元素;其他模板都继承base.html。当前,所有页面都包含的元素只有顶端的标题。我们将在每个页面中包含这个模板,因此,我们将这个标题设置为到主页的链接:

<p>
<a href="{% url 'learning_logs:index' %}">Learning Log</a>
</p>
{% block content %}{% endblock %}

  这个文件的第一部分建立一个包含项目名的段落,该段落也是一个到主页的链接。为创建链接,我们使用了一个模板标签,它是用大括号和百分号​​({% %})​​表示的。模板标签是一小段代码,生成要在网页中显示的信息。在这个实例中,模板标签​​{% url 'learning_logs:index' %}​​生成一个URL,该URL与​​learning_logs/urls.py​​中定义的名为index的URL模式匹配。在这个示例中,​​learning_logs​​是一个命名空间,而index是该命名空间中一个名称独特的URL模式。

  再简单的HTML页面中,链接是使用锚标签定义的:

<a href="link_url">link_text</a>

  让模板标签生成URL,可让链接保持最新容易得多。要修改项目中URL,只需修改urls.py中的URL模式,这样网页被请求时,Django将自插入修改后的URL。在我们的项目中,每个网页都将继承base.html,因此从现在开始,每个网页都包含到主页链接。

  另外,我们插入了一对块标签。这个块名为content,是一个占位符,其中包含的信息将由子模板指定。

  子模板并非必须定义父模板中的每个块,因此在父模板中,可使用任意多个块来预留空间,而子模板可根据需要定义相应数量的块。

  这里需要说明的是在Python代码中,我们几乎总是缩进四个空格。相比于Python文件,模板文件的缩进层级更多,因此每个层级通常只缩进两个空格。

  2、子模板

  现在需要重新编写​​index.html​​,使其继承base.html,具体如下所示:

<p>
<a href="{% url 'learning_logs:index' %}">Learning Log</a> -
<a href="{% url 'learning_logs:topics' %}">Topics</a>
</p>

{% block content %}{% endblock %}

  如果将这些代码与原来的index.html进行比较,可发现我们将标题LearningLog替换成了从父模板那里继承的代码。子模板的第一行必须包含标签{% extends %},让Django知道它继承了哪个父模板。文件base.html位于文件夹learning_logs中,因此父模板路径中包含learning_logs。这行代码导入模板base.html的所有内容,让index.html能够指定要在content块预留的空间中添加的内容。

  另外,我们插入了一个名为content的{% block %}标签,以定义content块。不是从父模板继承的内容都包含在content块中,在这里是一个项目描述项目“学习笔记”的段落。最后,我们使用标签{% endblock content %}指出了内容定义的结束位置。

  模板继承优点开始显示出来了;在子模板中,只需包含当前网页特有的内容。这不仅简化了每个模板,还使得网站修改起来容易得多。要修改很多网页都包含的元素,只需在父模板中修改该元素,你所做的修改将传导到继承该父模板的每个页面。在包含数十乃至数百个网页的项目中,这种结构使得网站改进起来容易而且快捷地多。

  在大型的项目中,通常有一个用于整个网站的父模板——base.html,且网站的每个主题部分都有一个父模板。每个部分的父模板都继承base.html,而网站的每个网页都继承相应部分的父模板。这让你能够轻功地修改整个网站的外观、网站任何一部分的外观以及任何一个网页的外观。这种配置提供了一种效率极高的工作方式,让你乐意不断地去改进网站。

2、显示所有主题的页面

  有了高效的网页创建方法,就能专注于另外两个网页了:显示全部主题的网页以及闲死特定的主题中条目的网页。所有主题页面显示用户创建的所有主题,它是第一个需要使用数据的网页。

  首先,我们来定义显示所有主题的页面url。通常,使用一个简单的URL片段来指出网页显示信息;我们将使用单词topics,因此将URL将返回显示所有主题的页面,下面我们演示了该如何修改​​learning_logs/urls.py​​:

"""定义learning_logs的URL模型"""
from django.conf.urls import url
from . import views
urlpatterns = [
# 主页
url(r'^$', views.index, name='index'),
# 显示所有主题
url(r'^topics/$', views.topics, name='topics'),
]

  我们只是在用于主页URL的正则表达式中添加了topics/。Django检查请求的url时,这个模式与这样的URL匹配:基础URL后面跟着topics。可以在末尾包含斜杠,也可以省略它,但单词topics后面不能有任何东西,否则就与该模式不匹配。其URL与该模式匹配的请求都将交给​​view.py​​中的函数​​topics()​​进行处理。

  函数​​topics()​​需要从数据库中获取一些数据,并将其发送给模板。我们需要在views.py中添加如下的代码:

from django.shortcuts import render
from .models import Topic
def index(request):
"""学习笔记的主页"""
return render(request, 'learning_logs/index.html')

def topics(request):
"""显示所有主题."""
topics = Topic.objects.order_by('date_added')
context = {'topics': topics}
return render(request, 'learning_logs/topics.html', context)

  我们首先导入了与所需数据相关联的模型。函数​​topic()​​包含一个形参:Django从服务器那里收到的request对象。另外,我们查询数据库——请求提供topic对象,并按属性date_added对它们进行排序。我们将返回的查询集存储在topics中。

  最后,我们定义了一个将要发送给模板上下文。上下文是一个字典,其中的键是我们将在模板中用在访问数据的名称,而值是我们要发送给模板的数据。在这里,只有一个键值对,它包含我们将在网页中显示的一组主题。创建使用数据网页时,除对象request和模板的路径外,我们还将变量context传递给render()。

  显示所有主题的页面的模板接受字典context,以便能够使用topics()提供的数据。请创建一个文件,将其命名为topic.html,并存储到index.html所在的目录中。接下来我们演示如何在这个模板中显示所有主题:

{% extends "learning_logs/base.html" %}

{% block content %}

<p>Topics</p>

<ul>
{% for topic in topics %}
<li>
<a href="{% url 'learning_logs:topic' topic.id %}">{{ topic }}</a>
</li>
{% empty %}
<li>No topics have been added yet.</li>
{% endfor %}
</ul>

{% endblock content %}

  就像模板​​index.html​​一样,我们首先使用标签​​{% extends %}​​来继承base.html,再开始定义content块。这个网页的主体是一个项目列表,其中列出了用户输入的主题。在标准HTML中,项目列表被称为无序列表,用标签ul表示。包含所有主题的项目列表。

  另外,我们使用了一个相当于for循环的模板标签,它遍历了字典context中列表topics。模板中使用了代码与Python代码存在一些重要的差别:Python使用了缩进来指出哪些代码行是for循环的组成部分,而在模板中,每个for循环都必须使用{% extends %}标签来显示地指出其结束的位置。因此在模板中,循环类似于下面这样:

{% for item in list %}
do something with each item
{% endfor %}

  在循环中,我们将每个主题转换为一个项目列表项。要在模板中打印变量,需要将变量名用花括号括起来。每次循环时。该代码{{topic}}都被替换为topic当前值。这些花括号不会出现在网页中,它们只是用于告诉Django我们使用了一个模板变量。HTML标签li,表示一个项目列表,在标签ul内部,位于标签li之间的内容都是一个项目列表项。

  另外,我们使用了模板标签{%empty%},它告诉Django在列表topics为空时该怎么办:这里是打印了一条消息,告诉用户还没有添加任何主题。最后两行分别结束for循环和项目列表。现在,我们需要修改父模板,使其包含到显示所有主题页面链接:

<p>
<a href="{% url 'learning_logs:index' %}">Learning Log</a> -
<a href="{% url 'learning_logs:topics' %}">Topics</a>
</p>

{% block content %}{% endblock %}

  我们到主页的链接后面添加了一个连字符,然后添加了一个到显示所有主题的页面链接——使用的也是模板标签url。这一行让Django生成一个链接,它与learning_logs/urls.py中名为topics的URL模式匹配。

  现在如果我们刷新;浏览器中的主页,将看到链接topics。单击这个链接,将看到如下所示的效果:

python应用篇之Web应用程序——Django入门(完结)_Python开发_04

总结

  ​​上篇文章​​我们给大家介绍了Django应用程序的创建、模型的定义与激活、Django管理网站、Entry模型的定义与迁移;最后又向管理网站注册Entry以及Django Shell的相关知识的简介。本文接着给大家介绍Django的相关内容,主要包括创建网页的流程,并且通过一个创建网页的案例加以说明。Python是一门注重实际操作的语言,它是众多编程语言中最简单,也是最好入门的。当你把这门语言学会了,再去学习java、go以及C语言就比较简单了。当然,Python也是一门热门语言,对于人工智能的实现有着很大的帮助,因此,值得大家花时间去学习。生命不息,奋斗不止,我们每天努力,好好学习,不断提高自己的能力,相信自己一定会学有所获。加油!!!



举报

相关推荐

0 条评论