Django1.6项目开发入门指南
立即解锁
发布时间: 2025-08-22 01:25:44 阅读量: 1 订阅数: 2 


Django Web开发实战秘籍
### Django 1.6 项目开发入门指南
#### 1. 引言
在使用 Python 2.7 和 Django 1.6 开启新的项目时,本文将介绍一些实用的最佳实践。这里提到的一些技巧是处理项目布局、设置和配置的最佳方式,但部分技巧可能存在其他替代方案,你可以在深入探索 Django 世界的过程中,评估并选择最适合自己的方法。
假设你已经熟悉 Django 的基础知识、Subversion 或 Git 版本控制、MySQL 或 PostgreSQL 数据库以及命令行的使用。同时,假定你使用的是基于 Unix 的操作系统,如 Mac OS X 或 Linux,因为基于 Unix 的平台开发 Django 项目是合理的,网站最终很可能会部署在 Linux 服务器上,这样可以确保开发和部署时的操作一致。如果你在 Windows 上本地开发 Django 项目,操作流程类似,但并非完全相同。
#### 2. 使用虚拟环境
在同一台计算机上很可能会开发多个 Django 项目。一些模块,如 Python 图像库(Pillow)和 MySQLdb,可以安装一次并供所有项目共享。而其他模块,如 Django 本身、第三方 Python 库和 Django 应用,则需要相互隔离。Virtualenv 是一个将 Python 项目分隔到各自独立环境的实用工具,下面将介绍如何使用它。
##### 2.1 准备工作
在使用虚拟环境之前,需要安装 pip(安装和管理 Python 包最便捷的工具)、共享 Python 模块 Pillow 和 MySQLdb 以及 virtualenv 工具,使用以下命令:
```bash
$ sudo easy_install pip
$ sudo pip install Pillow
$ sudo pip install MySQL-python
$ sudo pip install virtualenv
```
##### 2.2 操作步骤
1. 创建一个用于存储所有 Django 项目的目录,例如在主目录下创建 `virtualenvs` 目录,然后执行以下操作:
```bash
$ cd ~/virtualenvs
$ mkdir myproject_env
$ cd myproject_env
$ virtualenv --system-site-packages .
```
执行上述命令后,会输出如下信息:
```
New python executable in ./bin/python
Installing setuptools.............done.
Installing pip...............done.
```
2. 要使用新创建的虚拟环境,需要在当前 shell 中执行激活脚本,可以使用以下命令之一:
```bash
$ source bin/activate
$ . bin/activate
```
3. 激活后,命令行工具的提示符会添加项目名称的前缀,如下所示:
```bash
(myproject_env)$
```
4. 若要退出虚拟环境,输入以下命令:
```bash
$ deactivate
```
##### 2.3 工作原理
创建虚拟环境时,会创建特定的目录(bin、build、include 和 lib)来存储 Python 安装的副本,并定义一些共享的 Python 路径。激活虚拟环境后,使用 pip 或 easy_install 安装的任何内容都会被放入虚拟环境的站点包中,而不是 Python 全局的站点包。
若要在虚拟环境中安装 Django 1.6,可使用以下命令:
```bash
(myproject_env)$ pip install Django==1.6
```
#### 3. 创建项目文件结构
为项目建立一致的文件结构可以让你更有条理,提高开发效率。当基本工作流程确定后,就能更快地进入业务逻辑开发,创建出出色的项目。
##### 3.1 准备工作
如果还未创建用于存放所有虚拟环境的 `virtualenvs` 目录(可在主目录下创建),请先完成此操作。然后创建项目环境的目录,例如 `myproject_env`,并在其中启动虚拟环境,这将创建 bin、build、include 和 lib 目录。建议添加 `commands` 目录用于存放与项目相关的本地 bash 脚本,`db_backups` 目录用于存放数据库转储文件,`project` 目录用于存放 Django 项目。同时,在虚拟环境中安装 Django。
##### 3.2 操作步骤
1. 激活虚拟环境后,进入项目目录并启动新的 Django 项目:
```bash
(myproject_env)$ django-admin.py startproject myproject
```
2. 为了清晰起见,将新创建的目录重命名为 `django-myproject`,该目录应进行版本控制,其中会包含 `.git`、`.svn` 或类似的目录。
3. 在 `django-myproject` 目录中,创建 `README.md` 文件,用于向新开发者描述项目。还可以创建 `requirements.txt` 文件,列出 Django 版本及其他外部依赖项。该目录还将包含项目的 Python 包 `myproject`、Django 应用(建议创建一个名为 `utils` 的应用,用于共享项目中的不同功能)、如果项目支持多语言,还会有 `locale` 目录用于存放翻译文件、名为 `fabfile.py` 的 Fabric 部署脚本,以及 `externals` 目录(如果不使用 `requirements.txt`,可用于存放项目的外部依赖项)。
4. 在项目的 Python 包 `myproject` 中,创建以下目录:
- `media` 目录:用于项目上传文件。
- `site_static` 目录:用于存放项目特定的静态文件。
- `static` 目录:用于收集静态文件。
- `tmp` 目录:用于上传过程。
- `templates` 目录:用于存放项目模板。
同时,`myproject` 目录应包含项目设置文件 `settings.py` 和 `local_settings.py`,以及 URL 配置文件 `urls.py`。
5. 在 `site_static` 目录中,创建 `site` 目录作为特定于站点的静态文件的命名空间。然后将静态文件按类型分别放入不同的子目录中,例如:
- `scss` 目录(可选):用于存放 Sass 文件。
- `css` 目录:用于存放生成的压缩级联样式表。
- `img` 目录:用于存放样式图片和徽标。
- `js` 目录:用于存放 JavaScript 文件。
- 还可以包含一个第三方模块目录,例如富文本编辑器 `tinymce`。
除了 `site` 目录,`site_static` 目录还可能包含覆盖第三方应用静态目录的内容,例如 `cms` 覆盖 Django CMS 的静态文件。可以使用 CodeKit 或 Prepros 等具有图形用户界面的应用程序来从 Sass 生成 CSS 文件并压缩 JavaScript 文件。
6. 将按应用分隔的模板文件放入 `templates` 目录中。如果模板文件代表一个页面(例如 `change_item.html` 或 `item_list.html`),则直接将其放在应用的模板目录中;如果模板文件包含在另一个模板中(例如 `similar_items.html`),则将其放入 `includes` 子目录中。此外,`templates` 目录还可以包含一个名为 `utils` 的目录,用于存放全局可重用的代码片段,如分页、语言选择器等。
##### 3.3 工作原理
虚拟环境中完整项目的文件结构如下:
```plaintext
virtualenvs/
└── myproject_env/
├── bin/
├── build/
├── include/
├── lib/
├── commands/
├── db_backups/
└── django-myproject/
├── README.md
├── requirements.txt
├── myproject/
│ ├── media/
│ ├── site_static/
│ │ └── site/
│ │ ├── scss/
│ │ ├── css/
│ │ ├── img/
│ │ ├── js/
│ │ └── tinymce/
│ ├── static/
│ ├── tmp/
│ ├── templates/
│ │ ├── app1/
│ │ │ ├── change_item.html
│ │ │ └── includes/
│ │ │ └── similar_items.html
│ │ └── utils/
│ │ ├── pagination.html
│ │ └── language_chooser.html
│ ├── settings.py
│ ├── local_settings.py
│ └── urls.py
├── utils/
├── locale/
├── fabfile.py
└── externals/
├── libs/
└── apps/
```
#### 4. 使用 pip 处理项目依赖
Pip 是安装和管理 Python 包最便捷的工具。除了逐个安装包之外,还可以定义要安装的包列表,并将其传递给 pip,让它自动处理列表中的所有包。
##### 4.1 准备工作
在使用此方法之前,需要安装 pip 并激活虚拟环境。有关如何操作的更多信息,请参考“使用虚拟环境”部分。
##### 4.2 操作步骤
1. 进入进行版本控制的 Django 项目目录,创建 `requirements.txt` 文件,内容如下:
```plaintext
#requirements.txt
Django==1.6
South==0.8.4
django-cms==2.4
```
2. 运行以下命令安装 Django 项目所需的所有依赖项:
```bash
(myproject_env)$ pip install -r requirements.txt
```
##### 4.3 工作原理
该命令会将项目的所有依赖项逐个安装到虚拟环境中。当项目中有许多依赖项时,坚持使用特定版本的 Python 模块是一个好习惯,这样可以确保在部署项目或将其交给新开发者时,项目的完整性不会受到破坏,所有模块都能无冲突地正常运行。
如果你已经手动使用 pip 逐个安装了项目依赖项,可以使用以下命令生成 `requirements.txt` 文件:
```bash
(myproject_env)$ pip freeze > requirements.txt
```
##### 4.4 更多信息
如果你需要直接从版本控制系统或本地路径安装 Python 库,可以从官方文档 [http://pip.readthedocs.org/en/latest/reference/pip_install.html](http://pip.readthedocs.org/en/latest/reference/pip_install.html) 中了解更多关于 pip 的信息。
#### 5. 在项目中包含外部依赖项
有时,在项目中包含外部依赖项是更好的选择。这样可以确保当一个开发者升级第三方模块时,其他所有开发者在下一次从版本控制系统(Git、Subversion 等)更新代码时都能获得升级后的版本。此外,当库来自非官方源(Python 包索引 (PyPI) 以外的地方)或不同的版本控制系统时,将外部依赖项包含在项目中也是很有必要的。
##### 5.1 准备工作
启动一个包含 Django 项目的虚拟环境。
##### 5.2 操作步骤
1. 在 Django 项目下创建一个名为 `externals` 的目录。
2. 在 `externals` 目录下创建 `libs` 和 `apps` 目录:
- `libs` 目录:用于存放项目所需的 Python 模块,例如 `requests`、`boto`、`twython`、`whoosh` 等。
- `apps` 目录:用于存放第三方 Django 应用,例如 `django-haystack`、`django-cms`、`django-south`、`django-storages` 等。
强烈建议在 `libs` 和 `apps` 目录中创建 `README.txt` 文件,在其中说明每个模块的用途、使用的版本或修订号以及来源。
3. 目录结构如下:
```plaintext
django-myproject/
└── externals/
├── libs/
│ ├── requests/
│ ├── boto/
│ ├── twython/
│ └── whoosh/
└── apps/
├── django-haystack/
├── django-cms/
├── django-south/
└── django-storages/
```
4. 将外部库和应用添加到 Python 路径中,使其被识别为已安装的模块。可以在设置文件中添加以下代码:
```python
#settings.py
# -*- coding: UTF-8 -*-
import os
import sys
PROJECT_PATH = os.path.abspath(os.path.join(
os.path.dirname(__file__), ".."))
EXTERNAL_LIBS_PATH = os.path.join(PROJECT_PATH, "externals",
"libs")
EXTERNAL_APPS_PATH = os.path.join(PROJECT_PATH, "externals",
"apps")
sys.path = ["", EXTERNAL_LIBS_PATH, EXTERNAL_APPS_PATH] + sys.path
```
##### 5.3 工作原理
如果可以运行 Python 并导入某个模块,则说明该模块已在 Python 路径中。将模块添加到 Python 路径的一种方法是在导入位于不寻常位置的模块之前修改 `sys.path` 变量。`sys.path` 的值是一个目录列表,以空字符串开头表示当前目录,接着是虚拟环境中的目录,最后是 Python 安装的全局共享目录。可以在 Python shell 中查看 `sys.path` 的值:
```bash
(myproject_env)$ python
>>> import sys
>>> sys.path
```
当尝试导入模块时,Python 会在这个列表中搜索模块,并返回找到的第一个结果。首先,定义 `PROJECT_PATH` 变量,它是 `settings.py` 文件上一级的绝对路径。然后,定义 `EXTERNAL_LIBS_PATH` 和 `EXTERNAL_APPS_PATH` 变量,它们相对于 `PROJECT_PATH`。最后,修改 `sys.path` 属性,将新路径添加到列表的开头。注意,还添加了一个空字符串作为第一个搜索路径,这意味着在检查其他 Python 路径之前,应始终先检查任何模块的当前目录。
需要注意的是,这种包含外部库的方法对于具有 C 语言绑定的 Python 包(例如 `lxml`)在跨平台时可能不起作用。对于此类依赖项,建议使用前面介绍的 pip 的 `requirements.txt` 文件。
#### 6. 在设置中定义相对路径
Django 要求在设置中定义不同的文件路径,例如媒体文件的根目录、静态文件的根目录、模板路径、翻译文件路径等。由于虚拟环境可以设置在任何位置,并且用户可能在 Mac OS X、Linux 或 Windows 上工作,因此每个开发者的路径可能会有所不同。不过,有一种方法可以相对于 Django 项目目录定义这些路径。
##### 6.1 准备工作
首先,打开 `settings.py` 文件。
##### 6.2 操作步骤
修改与路径相关的设置,而不是硬编码本地目录的路径:
```python
#settings.py
# -*- coding: UTF-8 -*-
import os
PROJECT_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__),
".."))
MEDIA_ROOT = os.path.join(PROJECT_PATH, "myproject", "media")
STATIC_ROOT = os.path.join(PROJECT_PATH, "myproject", "static")
STATICFILES_DIRS = (
os.path.join(PROJECT_PATH, "myproject", "site_static"),
)
TEMPLATE_DIRS = (
os.path.join(PROJECT_PATH, "myproject", "templates"),
)
LOCALE_PATHS = (
os.path.join(PROJECT_PATH, "locale"),
)
FILE_UPLOAD_TEMP_DIR = os.path.join(PROJECT_PATH, "myproject", "tmp")
```
##### 6.3 工作原理
首先,定义 `PROJECT_PATH`,它是 `settings.py` 文件上一级的绝对路径。然后,使用 `os.path.join` 函数相对于 `PROJECT_PATH` 设置所有路径。
#### 7. 为 Subversion 用户动态设置 STATIC_URL
如果将 `STATIC_URL` 设置为静态值,每次更新 CSS 文件、JavaScript 文件或图像时,都需要清除浏览器缓存才能看到更改。有一种方法可以避免清除浏览器缓存,即在 `STATIC_URL` 中显示版本控制系统的修订号。每当代码更新时,访问者的浏览器将强制加载所有新的静态文件。
##### 7.1 准备工作
确保项目使用 Subversion 版本控制,并且在设置中定义了 `PROJECT_PATH`(参考“在设置中定义相对路径”部分)。然后,在 Django 项目中创建 `utils` 模块,并在其中创建 `misc.py` 文件。
##### 7.2 操作步骤
1. 在 `utils/misc.py` 文件中插入以下内容:
```python
#utils/misc.py
# -*- coding: UTF-8 -*-
import subprocess
def get_media_svn_revision(absolute_path):
repo_dir = absolute_path
svn_revision = subprocess.Popen(
'svn info | grep "Revision" | awk \'{print $2}\'',
stdout=subprocess.PIPE, stderr=subprocess.PIPE,
shell=True, cwd=repo_dir, universal_newlines=True)
rev = svn_revision.communicate()[0].partition('\n')[0]
return rev
```
2. 修改 `settings.py` 文件并添加以下行:
```python
#settings.py
# ... somewhere after PROJECT_PATH definition ...
from utils.misc import get_media_svn_revision
STATIC_URL = "/static/%s/" % get_media_svn_revision(PROJECT_PATH)
```
##### 7.3 工作原理
`get_media_svn_revision` 函数接受 `absolute_path` 目录作为参数,并在该目录中调用 `svn info` shell 命令以获取当前修订号。由于 `PROJECT_PATH` 处于版本控制之下,因此将其传递给该函数。然后,解析修订号,将其返回并包含在 `STATIC_URL` 的定义中。
#### 8. 为 Git 用户动态设置 STATIC_URL
如果你不想每次更改 CSS 和 JavaScript 文件或样式图像时都刷新浏览器缓存,则需要使用可变路径组件动态设置 `STATIC_URL`。通过动态更改 URL,每当代码更新时,访问者的浏览器将强制加载所有新的未缓存静态文件。下面将介绍在使用 Git 版本控制系统时如何为 `STATIC_URL` 设置动态路径。
##### 8.1 准备工作
确保项目使用 Git 版本控制,并且在设置中定义了 `PROJECT_PATH`(参考“在设置中定义相对路径”部分)。如果还未创建,在 Django 项目中创建 `utils` 模块,并在其中创建 `misc.py` 文件。
##### 8.2 操作步骤
1. 在 `utils/misc.py` 文件中添加以下内容:
```python
#utils/misc.py
# -*- coding: UTF-8 -*-
import subprocess
from datetime import datetime
def get_git_changeset(absolute_path):
repo_dir = absolute_path
git_show = subprocess.Popen(
'git show --pretty=format:%ct --quiet HEAD',
stdout=subprocess.PIPE, stderr=subprocess.PIPE,
shell=True, cwd=repo_dir, universal_newlines=True,
)
timestamp = git_show.communicate()[0].partition('\n')[0]
try:
timestamp = datetime.utcfromtimestamp(int(timestamp))
except ValueError:
return ""
changeset = timestamp.strftime('%Y%m%d%H%M%S')
return changeset
```
2. 在 `settings.py` 文件中导入新创建的 `get_git_changeset` 函数,并将其用于 `STATIC_URL` 路径:
```python
#settings.py
# ... somewhere after PROJECT_PATH definition ...
from utils.misc import get_git_changeset
STATIC_URL = "/static/%s/" % get_git_changeset(PROJECT_PATH)
```
##### 8.3 工作原理
`get_git_changeset` 函数接受 `absolute_path` 目录作为参数,并调用 `git show` shell 命令以获取该目录中 HEAD 修订的 Unix 时间戳。与前面的方法类似,将 `PROJECT_PATH` 传递给该函数,因为它处于版本控制之下。解析时间戳,将其转换为包含年、月、日、小时、分钟和秒的字符串,返回并包含在 `STATIC_URL` 的定义中。
通过以上步骤,你可以在 Django 1.6 项目开发中使用虚拟环境、创建合理的文件结构、处理项目依赖、包含外部依赖项、定义相对路径以及动态设置 `STATIC_URL`,从而提高开发效率和项目的可维护性。
### Django 1.6 项目开发入门指南
#### 总结与对比
为了更清晰地展示各个操作的要点,下面通过表格进行总结对比:
| 操作内容 | 准备工作 | 主要操作步骤 | 工作原理 | 注意事项 |
| --- | --- | --- | --- | --- |
| 使用虚拟环境 | 安装 pip、Pillow、MySQL-python、virtualenv | 1. 创建项目目录并创建虚拟环境<br>2. 激活虚拟环境<br>3. 安装 Django 1.6<br>4. 退出虚拟环境 | 创建特定目录存储 Python 副本,激活后安装内容存于虚拟环境站点包 | - |
| 创建项目文件结构 | 创建虚拟环境目录,启动虚拟环境并安装 Django | 1. 启动新 Django 项目并改名<br>2. 创建相关文件和目录 | 构建清晰的项目结构便于开发和管理 | - |
| 使用 pip 处理项目依赖 | 安装 pip 并激活虚拟环境 | 1. 创建 requirements.txt 文件<br>2. 安装依赖项<br>3. 生成 requirements.txt 文件 | 逐个安装依赖项到虚拟环境 | 坚持使用特定版本模块 |
| 在项目中包含外部依赖项 | 启动含 Django 项目的虚拟环境 | 1. 创建 externals 目录及子目录<br>2. 添加外部库到 Python 路径 | 修改 sys.path 使模块被识别 | 对有 C 语言绑定的包可能不适用 |
| 在设置中定义相对路径 | 打开 settings.py 文件 | 修改路径相关设置 | 基于 PROJECT_PATH 定义相对路径 | - |
| 为 Subversion 用户动态设置 STATIC_URL | 项目用 Subversion 控制,定义 PROJECT_PATH,创建 utils/misc.py | 1. 在 misc.py 中编写获取修订号函数<br>2. 修改 settings.py 设置 STATIC_URL | 获取修订号并包含在 STATIC_URL 中 | - |
| 为 Git 用户动态设置 STATIC_URL | 项目用 Git 控制,定义 PROJECT_PATH,创建 utils/misc.py | 1. 在 misc.py 中编写获取时间戳函数<br>2. 修改 settings.py 设置 STATIC_URL | 获取时间戳并包含在 STATIC_URL 中 | - |
#### 操作流程可视化
下面通过 mermaid 流程图展示使用虚拟环境和创建项目文件结构的操作流程:
```mermaid
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
A([开始]):::startend --> B(安装必要工具):::process
B --> C(创建虚拟环境目录):::process
C --> D(创建虚拟环境):::process
D --> E(激活虚拟环境):::process
E --> F(安装 Django 1.6):::process
F --> G(创建项目文件结构):::process
G --> H(完成):::startend
```
#### 实际应用场景分析
在实际的 Django 项目开发中,这些操作有着不同的应用场景:
- **小型项目**:对于小型项目,使用虚拟环境和 pip 处理依赖可以快速搭建开发环境,创建简单的项目文件结构即可满足需求。例如,一个简单的博客系统,只需要几个 Django 应用和基本的静态文件。
- **大型项目**:大型项目需要更复杂的文件结构和依赖管理。在项目中包含外部依赖项可以确保团队成员使用相同版本的库,动态设置 STATIC_URL 可以提高用户体验。例如,一个电商平台项目,涉及多个模块和大量的静态资源。
#### 常见问题及解决方法
在实际操作过程中,可能会遇到一些常见问题,下面给出相应的解决方法:
1. **虚拟环境激活失败**:
- 问题表现:执行激活脚本后,提示符未改变。
- 解决方法:检查虚拟环境目录是否正确,脚本路径是否存在。
2. **依赖项安装失败**:
- 问题表现:pip 安装依赖项时出现错误。
- 解决方法:检查网络连接,查看 requirements.txt 文件是否正确,尝试更新 pip 版本。
3. **外部依赖项无法识别**:
- 问题表现:导入外部依赖项时出现错误。
- 解决方法:检查 sys.path 是否正确添加了外部库路径,确保库文件存在。
#### 未来发展趋势
随着 Django 版本的不断更新,开发工具和方法也在不断改进。未来可能会有更便捷的虚拟环境管理工具,更智能的依赖项管理方式,以及更自动化的项目文件结构生成工具。同时,对于静态资源的处理也会更加高效,例如使用更先进的缓存策略和打包工具。
#### 学习建议
如果你想深入学习 Django 开发,建议按照以下步骤进行:
1. **实践操作**:按照本文介绍的方法,亲自搭建一个 Django 项目,熟悉各个操作步骤。
2. **阅读文档**:阅读 Django 官方文档,了解更多的功能和特性。
3. **参与开源项目**:参与开源的 Django 项目,学习他人的代码和开发经验。
4. **交流分享**:加入 Django 开发者社区,与其他开发者交流分享经验。
通过以上内容,你对 Django 1.6 项目开发的各个方面有了更全面的了解。希望这些信息能帮助你在 Django 开发的道路上取得更好的成果。
0
0
复制全文
相关推荐










