请选择 进入手机版 | 继续访问电脑版

笨鸟编程-零基础入门Pyhton教程

 找回密码
 立即注册

设计你的 URLs

发布者: 三寸日光

一个干净的,优雅的 URL 方案是一个高质量 Web 应用程序的重要细节。 Django 鼓励使用漂亮的 URL 设计,并且不鼓励把没必要的东西放到 URLs 里面,像 .php 或 .asp.

为了给一个 app 设计 URLs,你需要创建一个 Python 模块叫做 URLconf。这是一个你的 app 内容目录, 它包含一个简单的 URL 匹配模式与 Python 回调函数间的映射关系。这有助于解耦 Python 代码和 URLs 。

这是针对上面 Reporter/Article 例子所配置的 URLconf 大概样子:

from django.conf.urls import patterns

urlpatterns = patterns('',
    (r'^articles/(\d{4})/$', 'news.views.year_archive'),
    (r'^articles/(\d{4})/(\d{2})/$', 'news.views.month_archive'),
    (r'^articles/(\d{4})/(\d{2})/(\d+)/$', 'news.views.article_detail'),
)

上面的代码映射了 URLs ,从一个简单的正则表达式,到 Python 回调函数(“views”)所在的位置。 正则表达式通过圆括号来“捕获” URLs 中的值。当一个用户请求一个页面时, Django 将按照顺序去匹配每一个模式,并停在第一个匹配请求的 URL 上。(如果没有匹配到, Django 将会展示一个404的错误页面。) 整个过程是极快的,因为在加载时正则表达式就进行了编译。

一旦有一个正则表达式匹配上了,Django 将导入和调用对应的视图,它其实就是一个简单的 Python 函数。每个视图将得到一个 request 对象 – 它包含了 request 的 meta 信息 – 和正则表达式所捕获到的值。

例如:如果一个用户请求了个 URL “/articles/2005/05/39323/”, Django 将会这样调用函数 news.views.article_detail(request, '2005', '05', '39323').

编写你的视图(views)

每个视图只负责两件事中的一件:返回一个包含请求页面内容的 HttpResponse 对象; 或抛出一个异常如 Http404 。至于其他就靠你了。

通常,一个视图会根据参数来检索数据,加载一个模板并且根据该模板来呈现检索出来的数据。 下面是个接上例的 year_archive 例子

def year_archive(request, year):
    a_list = Article.objects.filter(pub_date__year=year)
    return render_to_response('news/year_archive.html', {'year': year, 'article_list': a_list})

这个例子使用了 Django 的 模板系统,该模板系统功能强大且简单易用,甚至非编程人员也会使用。

设计你的模板(templates)

上面的例子中载入了 news/year_archive.html 模板。

Django 有一个模板搜索路径板,它让你尽可能的减少冗余而重复利用模板。在你的 Django设置中,你可以指定一个查找模板的目录列表。如果一个模板没有在这个 列表中,那么它会去查找第二个,然后以此类推。

假设找到了模板 news/year_archive.html 。下面是它大概的样子:

{% extends "base.html" %}

{% block title %}Articles for {{ year }}{% endblock %}

{% block content %}
<h1>Articles for {{ year }}</h1>

{% for article in article_list %}
    <p>{{ article.headline }}</p>
    <p>By {{ article.reporter.full_name }}</p>
    <p>Published {{ article.pub_date|date:"F j, Y" }}</p>
{% endfor %}
{% endblock %}

变量使用双花括号包围。{{ article.headline }} 表示 “输出 article 的 headline 属性”。而点符号不仅用于表示属性查找,还可用于字典的键值查找、索引查找和函数调用。

注意 {{ article.pub_date|date:"F j, Y" }} 使用了 Unix 风格的“管道”(“|”符合)。这就是所谓的模板过滤器,一种通过变量来过滤值的方式。本例中,Python datetime 对象被过滤成指定的格式(在 PHP 的日期函数中可以见到这种变换)。

你可以无限制地串联使用多个过滤器。你可以编写自定义的过滤器。你可以定制自 己的模板标记,在幕后运行自定义的 Python 代码。

最后,Django 使用了“模板继承”的概念:这就是 {% extends "base.html" %} 所做的事。它意味着 “首先载入名为 ‘base’ 的模板中的内容到当前模板,然后再处理本模板中的其余内容。”总之,模板继承让你在模板间大大减少冗余内容:每一个模板只需要定义它独特的部分即可。

下面是使用了 静态文件 的 “base.html” 模板的大概样子:

{% load staticfiles %}
<html>
<head>
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
    <img src="{% static "images/sitelogo.png" %}" alt="Logo" />
    {% block content %}{% endblock %}
</body>
</html>

简单地说,它定义了网站的外观(含网站的 logo ),并留下了个“洞”让子模板来填充。这使站点的重新设计变得非常容易,只需改变一个文件 – “base.html” 模板。

它也可以让你创建一个网站的多个版本,不同的基础模板,而重用子模板。 Django 的创建者已经利用这一技术来创造了显著不同的手机版本的网站 – 只需创建一个新的基础模板。

请注意,如果你喜欢其他模板系统,那么你可以不使用 Django 的模板系统。 虽然 Django 的模板系统特别集成了 Django 的模型层,但并没有强制你使用它。同理,你也可以不使用 Django 的数据库 API。您可以使用其他数据库抽象层,您可以读取 XML 文件,你可以从磁盘中读取文件,或任何你想要的方法去操作数据。 Django 的每个组成部分: 模型、视图和模板都可以解耦,以后会谈到。

Archiver|手机版|笨鸟自学网 ( 粤ICP备20019910号 )

GMT+8, 2024-2-26 17:50 , Processed in 0.017208 second(s), 17 queries .

© 2001-2020

返回顶部