专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Python » pythondjango:使用 Django 和 Python 开发 Web 站点 »正文

pythondjango:使用 Django 和 Python 开发 Web 站点

来源: 发布时间:星期四, 2009年1月8日 浏览:24次 评论:0
  本系列文章共有两篇本文是其中在这篇文章中我们将展示 Django 使用方法Django 是 Python 编程语言驱动个开源模型-视图-控制器(MVC)风格 Web 应用框架使用 Django我们在几分钟的内就可以创建高品质、易维护、数据库驱动应用

  Django 项目是个定制框架它源自个在线新闻 Web 站点于 2005 年以开源形式被释放出来Django 框架核心组件有:

  用于创建模型对象关系映射

  为最终用户设计完美管理界面

   URL 设计

  设计者友好模板语言

  缓存Cache系统

  本文是有关 Python Web 框架由两篇文章组成系列文章第 2篇文章将向您介绍 TurboGears 框架

  要使用并理解本文中提供代码则需要安装 Python并了解在初学者水平上如何使用 Python要查看是否安装了 Python 以及 Python 版本号可以输入 python -VDjango 至少需要 2.3.5 版本 Python可以从 Python Web 站点上下载它(有关链接请参阅本文后面 参考资料 部分)我们至少还应该顺便熟悉下 MVC 架构

  安装 Django

  本文使用了 Django 开发版本以便能够利用 Django 框架最新改进建议您在 0.95 版正式发布的前使用这个版本有关最新发行版本请参阅 Django Web 站点(再次请您参阅 参考资料 来获得链接)

  按照以下步骤下载并安装 Django:

  清单 1. 下载并安装 Django~/downloads# svn co http://code.djangoproject.com/svn/django/trunk/ django_src
~/downloads# cd django_src
~/downloads# python up.py


  Django 管理工具

  在安装 Django 的后您现在应该已经有了可用管理工具 django-admin.py清单 2 给出了这个管理工具中可以使用些命令:

  清单 2. 使用 Django 管理工具~/dev$ django-admin.py
usage: django-admin.py action [options]
actions:
 adminindex [modelmodule ...]
  Prs the admin-index template snippet for the given model
  module name(s).
 ... snip ...
 startapp [appname]
  Creates a Django app directory structure for the given app name
  in the current directory.
 startproject [projectname]
  Creates a Django project directory structure for the given
  project name in the current directory.
 validate
  Validates all ed models.
options:
 -h, --help    show this help message and exit
 --tings=SETTINGS  Python path to tings module, e.g.
      "myproject.tings.". If this isn't
      provided, the DJANGO_SETTINGS_MODULE
      environment variable will be used.
 --pythonpath=PYTHONPATH
      Lets you manually add a directory the Python
      path, e.g. "/home/djangoprojects/myproject".


  Django 项目和应用

  要启动 Django 项请使用 django-admin startproject 命令如下所示:

  清单 3. 启动项目~/dev$ django-admin.py startproject djproject

  上面这个命令会创建个 djproject 目录其中包含了运行 Django 项目所需要基本配置文件:

  清单 4. djproject 目录内容

__init__.py
manage.py
tings.py
urls.py


  对于这个项目来说我们要构建个职位公告板应用 “jobs”要创建应用可以使用 manage.py 脚本这是个特定于项目 django-admin.py 脚本其中 tings.py 文件可以自动提供:

  清单 5. 使用 manage.py startapp

~/dev$ cd djproject
~/dev/djproject$ python manage.py startapp jobs


  这将创建个应用骨架其中模型有个 Python 模块视图有另外个 Python 模块jobs 目录中包含以下文件:

  清单 6. jobs 应用目录中内容

__init__.py
models.py
views.py


  提供应用在项目中位置纯粹是为新 Django 开发人员建立种惯例并不是必需旦开始在几个项目中混合使用应用就可以将应用放到自己命名空间中并使用设置和主 URL 文件将它们绑定在现在请按照下面给出步骤执行操作

  为了使 Django 认识到新应用存在还需要向 tings.py 文件中 INSTALLED_APPS 添加个条目对于这个职位公告板应用来说我们必须添加串 djproject.jobs:

  清单 7. 向 tings.py 中添加个条目

INSTALLED_APPS = (
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.sites',
  'djproject.jobs',
)


  创建个模型

  Django 提供了自己对象关系型数据映射组件(object-relational mapperORM)库它可以通过 Python 对象接口支持动态数据库访问这个 Python 接口非常有用功能十分强大但如果需要也可以灵活地不使用这个接口而是直接使用 SQL

  ORM 目前提供了对 PostgreSQL、MySQL、SQLite 和 Microsoft® SQL 数据库支持

  这个例子使用 SQLite 作为后台数据库SQLite 是个轻量级数据库它不需要进行任何配置自身能够以个简单文件形式存在于磁盘上要使用 SQLite可以简单地使用 uptools 来安装 pysqlite(有关 uptools 更多资料尤其是有关 easy_ 工具(需要单独安装)资料请参阅 参考资料):

  easy_ pysqlite

  在使用这个模型的前需要在设置文件中对数据库进行配置SQLite 只需要指定数据库引擎和数据库名即可

  清单 8. 在 tings.py 中配置数据库

DATABASE_ENGINE = 'sqlite3'
DATABASE_NAME = '/path/to/dev/djproject/database.db'
DATABASE_USER = ''
DATABASE_PASSWORD = ''
DATABASE_HOST = ''
DATABASE_PORT = ''


  这个职位公告板应用有两种类型对象:Location 和 JobLocation 包含 city、state(可选)和 country 字段Job 包含 location、title、description 和 publish date 字段

  清单 9. jobs/models.py 模块

from django.db import models
Location(models.Model):
  city = models.CharField(maxlength=50)
  state = models.CharField(maxlength=50, null=True, blank=True)
  country = models.CharField(maxlength=50)
  def __str__(self):
     self.state:
       "%s, %s, %s" % (self.city, self.state, self.country)
    :
       "%s, %s" % (self.city, self.country)
Job(models.Model):
  pub_date = models.DateField
  job_title = models.CharField(maxlength=50)
  job_description = models.TextField
  location = models.ForeignKey(Location)
  def __str__(self):
     "%s (%s)" % (self.job_title, self.location)


  __str__ 思路方法是 Python 中个特殊类它返回对象串表示Django 在 Admin 工具中显示对象时广泛地使用了这个思路方法

  要设置这个模型模式请返回 manage.py sql 命令此时模式尚未确定

  清单 10. 使用 manage.py sql 命令查看数据库模式

~/dev/djproject$ python manage.py sql jobs
BEGIN;
CREATE TABLE "jobs_job" (
  "id" eger NOT NULL PRIMARY KEY,
  "pub_date" date NOT NULL,
  "job_title" varchar(50) NOT NULL,
  "job_description" text NOT NULL,
  "location_id" eger NOT NULL
);
CREATE TABLE "jobs_location" (
  "id" eger NOT NULL PRIMARY KEY,
  "city" varchar(50) NOT NULL,
  "state" varchar(50) NULL,
  "country" varchar(50) NOT NULL
);
COMMIT;


  为了化并安装这个模型请运行数据库命令 syncdb:

  ~/dev/djproject$ python manage.py syncdb

  注意syncdb 命令要求我们创建个超级用户帐号这是 django.contrib.auth 应用(提供基本用户身份验证功能)默认情况下是在 INSTALLED_APPS 设置中提供超级用户名和密码用来登录将在下节介绍管理工具记住这是 Django 超级用户而不是系统超级用户

  查询集

  Django 模型通过默认 Manager 类 objects 来访问数据库例如要打印所有 Job 列表则应该使用 objects 管理器 all 思路方法:

  清单 11. 打印所有职位

>>> from jobs.models import Job
>>> for job in Job.objects.all:
...   pr job


  Manager 类还有两个过滤思路方法:个是 filter另外个是 exclude过滤思路方法可以接受满足某个条件所有思路方法但是排除不满足这个条件其他思路方法下面查询应该可以给出相同结果(“gte” 表示 “大于或等于”而 “lt” 表示 “小于”)

  清单 12. 排除和过滤职位

>>> from jobs.models import Job
>>> from datetime import datetime
>>> q1 = Job.objects.filter(pub_date__gte=datetime(2006, 1, 1))
>>> q2 = Job.objects.exclude(pub_date__lt=datetime(2006, 1, 1))


  filter 和 exclude 思路方法返回些 QuerySet 对象这些对象可以链接在甚至可以执行连接操作下面 q4 查询会查找从 2006 年 1 月 1 日开始在俄亥俄州 Cleveland 张贴职位:

  清单 13. 对职位进行更多排除和过滤

>>> from jobs.models import Job
>>> from datetime import datetime
>>> q3 = Job.objects.filter(pub_date__gte=datetime(2006, 1, 1))
>>> q4 = q3.filter(location__city__exact="Cleveland",
...        location__state__exact="Ohio")


  QuerySets 是惰性点非常不错这意味着只在对数据库进行求值的后才会对它们执行查询这会比立即执行查询速度更快

  这种惰性利用了 Python 分片(slicing)功能下面代码并没有先请求所有记录然后对所需要记录进行分片而是在实际查询中使用了 5 作为 OFFSET、10 作为 LIMIT这可以极大地提高性能

  清单 14. Python 分片

>>> from jobs.models import Job
>>> for job in Job.objects.all[5:15]
...   pr job


  注意:使用 count 思路方法可以确定个 QuerySet 中有多少记录Python len 思路方法会进行全面计算然后统计那些以记录形式返回行数而 count 思路方法执行则是真正 SQL COUNT 操作其速度更快我们这样做数据库管理员会感激我们

  清单 15. 统计记录数

>>> from jobs.models import Job
>>> pr "Count = ", Job.objects.count    # GOOD!
>>> pr "Count = ", len(Job.objects.all)  # BAD!


  有关更多信息请参阅 参考资料 部分给出 Django “Database API reference” 链接

  管理员工具

  Django 最大卖点的是其管理界面这个工具是按照最终用户思路设计它为我们项目提供了很多数据输入工具

  管理工具是 Django 提供个应用和 jobs 应用在使用的前也必须进行安装个步骤是将应用模块(django.contrib.admin)添加到 INSTALLED_APPS 设置中:

  清单 16. 修改 tings.py

INSTALLED_APPS = (
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.sites',
  'djproject.jobs',
  'django.contrib.admin',
)


  要让该管理工具可以通过 /admin URL 使用只需要简单地取消项目 urls.py 文件中提供对应行内容即可节将详细介绍 URL 配置

  清单 17. 使管理工具可以通过 urls.py 使用

from django.conf.urls.defaults import *
urlpatterns = patterns('',
  (r'^admin/', ('django.contrib.admin.urls.admin')),
)


  这个管理应用有自己数据库模型但也需要进行安装我们可以再次使用 syncdb 命令来完成这个过程:

  python manage.py syncdb

  要查看这个管理工具可以使用 Django 提供测试服务器

  清单 18. 使用测试服务器来查看管理工具

~/dev/djproject$ python manage.py runserver
Validating models...
0 errors found.
Django version 0.95 (post-magic-removal), using tings 'djproject.tings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C (Unix) or CTRL-BREAK (Windows).


  现在可以使用 http://localhost:8000/admin 启动管理工具并使用前面创建超级用户帐号进行登录我们注意到现在还没有可用模块

  要让个类可以通过管理工具进行访问我们需要为其创建个 Admin 子类然后可以通过为这个子类添加类属性来定制如何对每个类进行管理清单 19 展示了如何将 Location 类添加到这个管理工具中

  清单 19. 使用管理工具添加 Location 类

Location(meta.Model):
  ...
   Admin:
    list_display = ("city", "state", "country")


  现在就可以通过管理界面来创建、更新和删除 Location 记录了

  图 1. 使用管理工具编辑位置

    (r'^$', 'djproject.jobs.views.index'),
  (r'^(?P<job_id>d+)/$', 'djproject.jobs.views.detail'),
)

  由于 view 思路方法现在都是来自同个模块因此第个参数可以使用这个模块根名称来指定 djproject.jobs.viewsDjango 会使用它来查找 index 思路方法和 detail 思路方法:

0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: