泽塔地带

你好!这里是泽塔地带,我会把中文博客以及翻译的外语文章放到这里。

如何创建一个 Django 项目(译)

Django 是一个功能丰富的 Python web 框架,但这并不代表它具有全部所需的功能。本文是一个构建和配置 Django 项目的实用指南,也包括了附加的库以及我的一些想法。本文的读者最好能有一些使用 Django 的经验。读者可以用官方教程温习一下 Django 的基础。

首先安装 uv ,然后使用这个命令创建一个虚拟库(virtual package)作为我们的项目(awesome_site):

1uv init --virtual awesome_site

然后删除默认的 main.py 并创建新 Django 项目:

1cd awesome_site
2rm main.py
3uv add 'django==5.2.*'
4uv run django-admin startproject django_project

在上面的代码中,我安装了 Django 5.2 并创建了一个名为 django_projectDjango 项目。

我安装 Django 5.2 的原因是 Django x.2 版本会得到3年的支持(LTS)。Django 长期支持版的大部分更新都是安全更新,而非功能更新,所以我们不需要频繁地重写我们的代码。不断地重写代码来追最新的 Django 版本是一项很繁琐的工作。

我虽然可以为上文的 Django 项目随意命名,但是仍把这个项目命名为 django_project,其中一个原因是 uv 创建的母项目 awesome_site 已经是我想要的项目名。另外一个原因是,在此项目中,Django 会在 django_project/django_project 目录储存配置文件,这样的项目名可以帮助我们快速找到配置文件目录。

额外的库

这几个库基本上是必需的:environs, django-taggit, django-extensions, django-debug-toolbar。

environs

读者可以使用这个命令安装 environs 库:

1uv add 'environs[django]'

environs 不仅可以读取系统环境变量和环境变量文件,还可以把这些值转换为合适的类型。比如,类型为 list 和 dict 的环境变量是这样表示的:

 1export GITHUB_REPOS=webargs,konch,ped
 2# in Python:
 3# print(env.list("GITHUB_REPOS"))
 4# ["webargs", "knoch", "ped"]
 5
 6
 7export GITHUB_REPO_PRIORITY="webargs=2,konch=3"
 8# in Python:
 9# print(env.dict("GITHUB_REPO_PRIORITY"))
10# {"webargs": "2", "konch: "3"}

有了 django 扩展,environs 可以把连接数据库的字符串转换为 Django 的数据库配置。 比如:

1# Parse database URLs, e.g.  "postgres://localhost:5432/mydb"
2DATABASES = {"default": env.dj_db_url("DATABASE_URL")}

和下面的配置是等价的:

1DATABASES = {
2    'default': {
3        'ENGINE': 'django.db.backends.postgresql',
4        'NAME': 'mydb',
5        'HOST': 'localhost',
6        'PORT': '5432',
7    }
8}

django-taggit

django-taggit 可以给你的 Django 数据库模型类增加 TaggableManager 字段。读者用下面的命令来安装这个库:

1uv add 'django-taggit'

读者可以按照下面的例子来使用这个库:

1print(apple.tags.all())
2# []
3
4apple.tags.add("red", "green", "fruit")
5
6print(apple.tags.all())
7# ["red", "green", "fruit"]

django-extensions

django-extensions 是一个 Django 工具集。使用下面的命令来使用 uv 安装这个库:

1uv add django-extensions ipython

读者还需要把它加在 INSTALLED_APPS 列表中。INSTALLED_APPS 列表在这个文件中:django_project/django_project/settings.py

1INSTALLED_APPS = (
2    # ...
3    "django_extensions",
4)

说实话,我只用这个库中的 shell_plus 扩展来自动载入数据库模型:

1uv run manage.py shell_plus

读者可以为上面的命令设置 ipython 解释器,方法是在 django_project/django_project/settings.py 中添加一行:

1SHELL_PLUS = "ipython"

这个库的文档也很有意思。

django-debug-toolbar

django-debug-toolbar 是一个不错的调试侧边栏。读者可以按照官方文档来安装这个库。

RESTful API 开发库

除了 Django REST Framework 库,读者还需要 dj-rest-authdjango-allauth 来实现健壮的认证和鉴权。读者可以阅读一下这些库的官方文档。

Web Socket 配置

首先安装 channels。 Channels 是一个 ASGI 独享库,这意味着读者只能在 ASGI 服务器上提供 Web Socket 路径。

然后配置 channels。首先创建一个协议路由来让 ASGI 服务器接受全部 TCP 连接(HTTP 和 Web Socket),然后再把HTTP请求交给原 Django 应用 (application) 来处理。再把 Web Socket 请求按照请求路径交由 Web Socket 消费者(consumer)类来处理。读者可以参考 channels 官方教程的具体步骤。

后台任务

后台任务依赖 celery 库。

在上面的项目中安装 celery 的方法是在 django_project/django_project 目录中创建一个 celery.py。在此文件中,初始化 Django 环境以及 celery 应用(application),并收集此项目中的所有后台任务。然后读者就可以同时启动 Django 和 celery 了。读者可以参照官方文档的具体步骤。