锻造车间 - Django 初步
当我最初开始开发 Web 应用程序时,我的大部分工作都是用 Perl 完成的,我的程序通过 CGI 调用。多年来,我的偏好有所转变,首先转向基于组件和模板的系统,如 Mason 和 Zope,然后转向全方位的框架,如 OpenACS。最近,我一直在使用 Ruby on Rails。作为一名长期的 Perl 程序员,Ruby 语言和 Rails 框架都让我感到惊喜。
但是,当然,Ruby 不是唯一流行的语言,Rails 也不是唯一流行的框架。在过去一两年中,Rails 最大的竞争对手之一是 Django,这是一个基于 Python 的框架,其目标与 Rails 相似。Django 最初是由 Adrian Holovaty 在堪萨斯州劳伦斯的一家报社工作时编写的。Holovaty 现在为 华盛顿邮报 工作,但他继续与其他开源贡献者一起致力于该框架。
说 Django 是 Rails 的 Python 移植版(反之亦然)是具有误导性的。但是,这两个项目之间有很多相似之处。Rails 和 Django 都源于成功的商业项目,前者在 37 Signals,后者在一家报社。两者都渴望使 Web 开发变得有趣和容易,尽可能地消除此类工作中的乏味。两者都使用模型-视图-控制器 (MVC) 范例来处理操作和创建页面。两者都在整个系统中使用特定的编程语言来编写代码和配置文件。而且,两者都成功地聚集了大量的追随者,确保了它们都将在未来一段时间内继续得到发展。
那么,本月,我将开始 Django 世界之旅,看看这个框架到底有什么吸引人的地方。即使你永远不会在 Django 中创建任何东西,或者你不喜欢 Python 语言,我仍然希望 Django 能教会你一些东西,或者至少让你思考一些东西。
Django 的主 Web 服务器位于 www.djangoproject.com,您可以从那里下载一个版本到您自己的计算机上。在撰写本文时,最新的官方版本是 0.96。您可以下载 .tar.gz 文件中的版本,或者您可以稍微冒险一点,通过 Subversion (svn) 获取最新的开发版本。我为本专栏选择了后一种方式,但如果我在商业站点工作,我可能更喜欢稳定版本。
与 Ruby on Rails 的情况一样,Django 代码 不是 骨架 Web 站点,因此不应将其放置在可通过 Web 公开查看的目录下。相反,代码应该像服务器上的任何其他 Python 库和程序集一样安装,使用标准的 Python 安装例程
python setup.py install
一旦完成此安装,您可以使用它来创建一个或多个 Django 项目。这里的术语可能有点棘手,特别是如果您来自 Rails 世界,请务必小心。一个 Django 项目包含一个或多个应用程序。每个应用程序然后包含模型、视图和模板集。一个应用程序可以在多个项目中重用——类似于 Rails 中的插件或引擎。例如,您可以想象一个日历应用程序被多个项目使用,以及一个门户项目使用来自其他地方的多个应用程序(例如,日历、电子邮件和 RSS 阅读器)。
这意味着当我们创建 Django 项目时,我们还没有准备好向世界展示任何代码。相反,我们需要创建一个项目,并在该项目中至少创建一个应用程序,才能看到任何动态输出。
让我们创建一个站点(在 Django 教程中命名为 mysite,所以我在这里使用相同的约定)
django-admin.py startproject mysite
当我在我的 Ubuntu 机器上安装 Django 时,它将管理程序 django-admin.py 放在 /usr/bin 中。您的系统可能将其放在不同的位置,因此您可能需要修改您的 PATH 才能使上述内容按书写方式工作。
以这种方式启动项目会创建一个名为 mysite 的目录,其中包含四个 Python 源文件,每个文件都带有 .py 扩展名
一个空白的 __init.py__ 文件:每当目录包含 __init.py__ 时,Python 都会将整个目录视为一个单独的包。只要该文件存在,即使它是空白的,我们的项目也将被视为一个包。
settings.py:此文件不包含可执行代码,而是 Django 实例的配置设置。例如,我们很快将修改此文件以指示我们正在使用的关系数据库的位置和类型。
urls.py:这是我们将 URL 与功能相关联的地方,使用正则表达式来匹配 URL。如果您来自 Rails 世界,这在很多方面类似于 config/routes.rb。
manage.py:这是一个 Django 站点的包罗万象的管理程序,处理大量的管理任务,例如启动、停止和同步项目。
再次强调,不要使 mysite 目录通过 Web 对外可见。相反,我们将通过我们的 Django 项目向世界公开此目录的某些部分。
如果您来自 Ruby on Rails 的世界,这可能看起来是开始时文件数量非常少。(开箱即用,Rails 会创建大量文件和目录。)但是,这是因为我们还没有真正创建任何应用程序,只是创建了将控制和使用应用程序的包(或容器,如果您愿意的话)。
尽管如此,该包确实有自己的 HTTP 服务器,就像 Rails 自带一个服务器一样。我们可以通过启动该 HTTP 服务器来测试事物是否井然有序,至少在包级别是这样。
python manage.py runserver
这是我们第一次使用 manage.py,但这远非最后一次。服务器将仅在本地主机地址 (127.0.0.1) 上运行,这表明基本框架已启动并正在运行,您现在应该继续进行数据库定义。
在服务器端,我们收到以下消息
Validating models... 0 errors found. Django version 0.97-pre, using settings 'mysite.settings' Development server is running at http://127.0.0.1:8000/ Quit the server with CONTROL-C.
前两行表明我们的模型(我们用来描述关系数据库表内容的文件)不存在,这意味着它们生成 0 个错误。(别担心;我们将在不久的将来添加新模型,从而产生错误。)Django 还非常友好地提供了版本信息,以指示从中获取设置的文件以及我们如何退出服务器。
使用像 Django 这样的框架的部分原因是它为我们提供了一个出色的对象关系映射器——一种花哨的说法,它将 Python 对象转换为数据库表,然后再转换回来,而无需我们太费力。但是,当然,只有当我们将 Django 连接到数据库时,这才有可能。
对于这个项目,我创建了一个名为 atf 的小型 PostgreSQL 数据库
createdb -U reuven atf
然后我可以修改 settings.py,进行以下变量赋值
DATABASE_ENGINE = 'postgresql' DATABASE_NAME = 'atf' DATABASE_USER = 'reuven' DATABASE_PASSWORD = '' DATABASE_HOST = '' DATABASE_PORT = '5433'
请注意,我必须显式地将 DATABASE_PORT 设置为 5433。在我的系统上,Django 尝试连接到端口 5432 上的 PostgreSQL 服务器,但数据库正在监听端口 5433。
在我们运行应用程序之前,我们现在应该同步数据库。这是 Django 术语,用于创建数据库中尚未定义的表。我们通过键入(在另一个 shell 中)来完成此操作
python manage.py syncdb
现在,如果您来自 Rails 世界,您可能此时会挠头。Django 可能需要创建哪些表?我没有定义任何数据库表或模型对象——发生了什么事?
答案是,虽然 Rails 和 Django 在某些方面相似,但在其他方面却大相径庭。其中一种方式与身份验证有关。Django 假设每个人都希望拥有一个身份验证系统。在创建适当的数据库表后,Django 会提示您输入站点的超级用户的用户名、电子邮件地址和密码。然后,它完成管理表的创建。
现在我们可以再次启动我们的服务器
python manage.py runserver
如果您在本地工作站以外的机器上运行 Django 开发站点,您可能需要添加可选的 IP 地址和端口号
python manage.py runserver 10.0.0.1:8000
如果您将 Web 浏览器指向您刚刚设置的服务器,您一定会感到失望。是的,我们看到 Django 正在运行,但我们也看到当我们尝试访问服务器时,它给了我们一个错误消息。发生了什么事?
简单的答案是我们尚未用任何应用程序填充我们的项目。项目存在,服务器正在运行,但它们基本上是一个空壳。在我们创建并安装一个或多个应用程序之前,我们将看不到太多内容。
例外是 Django 管理包,它随系统一起提供并且立即可用。好吧,这不太正确。它是可用的,但前提是您显式修改已安装应用程序 (INSTALLED_APPS) 的列表以包含适当的包名称。幸运的是,我们可以毫不费力地做到这一点。我们打开 mysite/settings.py,向下滚动到底部并修改 INSTALLED_APPS,使其包含字符串
"django.contrib.admin"
您甚至不必重启服务器。一旦添加此值,系统将要求您使用用户名和密码登录。输入您在 Django 创建管理数据库时提供给 Django 的值,您将获得一个格式良好(如果内容稀少)的管理站点,其中包含指向 Django 文档的链接。
在没有安装任何其他应用程序的情况下,拥有一个 Django 管理站点似乎有点傻。但是,Django 提供而 Rails 不提供的一件事是底层的身份验证和安全系统。开箱即用,Django 了解存在用户和组,并且可能需要为他们分配不同的权限。您可以轻松地添加、修改和删除组,从提供的列表中为他们授予一个或多个权限。
即使没有任何应用程序,您也可以创建和管理一个具有用户、组和权限级别的系统。如果 Django 支持组的层次结构,而不是它目前使用的一级模型,那就太好了。无论如何,我一直很喜欢带有内置用户、组和权限的 Web 框架。Django 附带一个图形系统来操作它们这一事实就更好了。
本月,我们开始了解 Django,这是一个流行的用 Python 编写的开源 Web 框架。我们启动并运行了我们的 Django 项目,包括与关系数据库的连接。我们甚至能够浏览其一些管理屏幕,为用户和组分配权限。下个月,我们将继续探索 Django,了解如何使用其 MVC(模型-视图-控制器)范例的版本创建新应用程序。
资源
Django 的主要站点位于 www.djangoproject.com。该站点包含大量文档,包括教程和指向邮件列表的指针。
即将出版的 Django 书籍(由 Apress 出版)的预发布副本位于 www.djangobook.com/en/beta,虽然这本书在很多地方仍未完成,但它写得很好,并且包含许多示例。
如果您有兴趣比较 Ruby on Rails 和 Django,有很多站点和博客条目对此进行了研究,其中一些站点和博客条目对双方的尊重程度略有不同。我在 django-users Google 群组中找到的一个主题位于 groups.google.com/group/django-users/browse_thread/thread/c59a3b4e1fb9cae7?tvc=2。
Reuven M. Lerner,一位长期的 Web/数据库顾问,是伊利诺伊州埃文斯顿西北大学学习科学专业的博士候选人。他目前与妻子和三个孩子住在伊利诺伊州斯科基。您可以在 altneuland.lerner.co.il 阅读他的博客。