Django 自定义命令 - 新手教程
各位程序员朋友们,大家好!
本文将介绍如何编写自定义Django 命令,这些命令可以帮助我们在生产环境中测试、上传数据或从 Django 项目中提取有价值的信息。对于新手来说,Django 是一个流行的 Web 框架,由经验丰富的开发人员使用 Python 设计和编写。
自定义命令的主要优势在于,所有 Django 组件都已加载完毕,随时可用。这意味着您可以导入模型、使用Django的 ORM 执行数据库查询,并与项目的所有资源进行交互。
涵盖的主题
- 创建一个新的 Django 应用并更新 Django 以使用它
- 可视化应用程序内部所需的目录结构
- 代码最后执行一些自定义命令:
cmd_time.py- 显示当前时间戳cmd_apps列出所有已注册的应用cmd_models列出所有应用程序和相关型号cmd_showcfg- 列出所有 CFG 键和值
- 源代码可在Github上找到(MIT许可证)。
创建一个新的 Django 应用
本教程假设我们已经有一个可以正常运行的 Django 项目,接下来我们将通过子命令创建一个新应用startapp:
$ python manage.py startapp app_customcmd
在新app目录下,我们需要创建如下所示的目录结构:
< PROJECT ROOT > <-- project directory
|
|-- app_customcmd/ <-- app directory
| |-- management/
| | +-- __init__.py
| | +-- commands/
| | +-- __init__.py
| | +-- cmd_....py <-- module where all commands are saved
一旦我们构建并配置了 Django 以使用新应用程序,commands即使不重启应用程序,目录中定义的所有命令也会自动被发现。
配置 Django 以使用该应用程序
要执行我们的自定义命令,我们需要app_customcmd在项目配置中激活:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app_customcmd', # <-- NEW
]
自定义命令
本节介绍一些自定义命令,这些命令将访问和报告与 Django 项目内部相关的一些内容 - 让我们开始吧!
显示当前时间
这条简单的自定义命令帮助我们实现了这个概念。以下是保存在目录中的代码app_customcmd/management/commands:
from django.core.management.base import BaseCommand
from django.utils import timezone
class Command(BaseCommand):
help = 'Displays current time'
def handle(self, *args, **kwargs):
time = timezone.now().strftime('%X')
self.stdout.write("It's %s" % time)
实际执行的代码位于该handle方法中,执行结果应显示类似以下内容:
$ python manage.py cmd_time
It's 09:18:08 <-- The output from our custom CMD
代码中最重要的一点是,我们使用BaseCommand超类来定义类。
显示已注册的应用
此示例将遍历所有已注册和活跃的应用程序,并打印它们的名称。
from django.core.management.base import BaseCommand
from django.apps import apps
class Command(BaseCommand):
help = 'Displays registered apps'
def handle(self, *args, **kwargs):
for app in apps.get_app_configs():
self.stdout.write(" APP -> %s" % app.verbose_name)
脚本执行及输出:
$ python manage.py cmd_apps
APP -> Administration # Default Django App
APP -> Authentication and Authorization # Default Django App
APP -> Content Types # Default Django App
APP -> Sessions # Default Django App
APP -> Messages # Default Django App
APP -> Static Files # Default Django App
APP -> App_Customcmd # <-- Our NEW App
显示每个应用程序的模型
此命令与前一个命令非常相似,但还会提供每个应用程序的已注册模型。
from django.core.management.base import BaseCommand
from django.apps import apps
class Command(BaseCommand):
help = 'Displays registered apps and models'
def handle(self, *args, **kwargs):
# Iterate over apps
for app in apps.get_app_configs():
self.stdout.write(" APP -> %s" % app.verbose_name)
# Iterate over models # <-- New Code
for model in app.get_models(): # <-- New Code
self.stdout.write("\t |- (model) -> %s" % model) # <-- New Code
执行和输出
$ python manage.py cmd_models
APP -> Administration
|- (model) -> <class 'django.contrib.admin.models.LogEntry'>
APP -> Authentication and Authorization
|- (model) -> <class 'django.contrib.auth.models.Permission'>
|- (model) -> <class 'django.contrib.auth.models.Group'>
|- (model) -> <class 'django.contrib.auth.models.User'>
APP -> Content Types
|- (model) -> <class 'django.contrib.contenttypes.models.ContentType'>
APP -> Sessions
|- (model) -> <class 'django.contrib.sessions.models.Session'>
APP -> Messages
APP -> Static Files
APP -> App_Forms
APP -> App_Pdf
APP -> App_Customcmd
APP -> App
|- (model) -> <class 'app.models.Book'>
打印配置变量
此自定义命令扫描settings对象的属性并打印所有值。
from django.core.management.base import BaseCommand
from django.utils import timezone
from django.conf import settings
class Command(BaseCommand):
help = 'Displays project config'
def handle(self, *args, **kwargs):
# type( settings ) => <class 'django.conf.LazySettings'>
# settings.__dict__
# Iterate over apps
for key in settings.__dict__.keys():
self.stdout.write(" Cfg Key: " + key + " -> %s" % settings.__dict__[ key ] )
输出和执行情况:
(env) PS D:\work\repo-samples\django-learn-by-coding> python manage.py cmd_showcfg
Cfg Key: _wrapped -> <Settings "config.settings">
Cfg Key: INSTALLED_APPS -> ['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app_forms', 'app_pdf', 'app_customcmd', 'app']
Cfg Key: DEBUG -> True
Cfg Key: LOGGING_CONFIG -> logging.config.dictConfig
Cfg Key: LOGGING -> {}
Cfg Key: DEFAULT_EXCEPTION_REPORTER -> django.views.debug.ExceptionReporter
Cfg Key: FORCE_SCRIPT_NAME -> None
Cfg Key: DEFAULT_TABLESPACE ->
Cfg Key: DEFAULT_AUTO_FIELD -> django.db.models.BigAutoField
Cfg Key: ABSOLUTE_URL_OVERRIDES -> {}
Cfg Key: AUTH_USER_MODEL -> auth.User
Cfg Key: DATABASES -> {'default': {'ENGINE': 'django.db.backends.sqlite3', 'NAME': WindowsPath('D:/work/repo-samples/django-learn-by-coding/db.sqlite3'), 'ATOMIC_REQUESTS': False, 'AUTOCOMMIT': True, 'CONN_MAX_AGE': 0, 'OPTIONS': {}, 'TIME_ZONE': None, 'USER': '', 'PASSWORD': '', 'HOST': '', 'PORT': '', 'TEST': {'CHARSET': None, 'COLLATION': None, 'MIGRATE': True, 'MIRROR': None, 'NAME': None}}}
...
(truncated output)
在我们的 Django 项目中编写自定义命令可以帮助我们提取统计信息、执行定时任务以及检查在生产环境中运行的项目的健康状况。
感谢阅读!如需更多资源和支持,请访问:
- 编写自定义命令- 官方文档
- AppSeed提供了更多Django 入门模板
- 注册用户可享受免费支持(电子邮件和 Discord)。