如何在 Django 中创建自定义命令?

如果您需要查看如何创建自定义 django 命令的示例。在本文中,我们将实现一个如何创建自定义 django 管理命令。
您可以查看自定义 django 管理命令示例。
在本文中,我们将实现一个如何在 django 中创建自定义命令。

在您的 Django 项目中,Django 中的manage.py文件是一个命令行实用程序,其工作方式类似于 django-admin 命令。不同之处在于它指向项目的settings.py文件。这个manage.py实用程序提供了您在使用 django 时必须拥有的各种命令。

在这里,我简单地解释了如何在 django 中创建自定义 django 命令的分步示例。
第 1 步:创建项目

在这一步中,我们将使用 django-admin 创建一个新的 django 项目。返回命令行界面并运行以下命令:

 django-admin startproject example 

第 2 步:创建应用程序

现在我们将创建一个名为core的应用程序来存储帖子名称列表。我们有意保持基本。使用Control+c停止本地服务器并使用startapp命令创建这个新应用程序。

 python3 manage.py startapp core 

第三步:更新setting.py

接下来,在我们的settings.py文件中更新INSTALLED_APPS以通知 Django 该应用程序。

接下来需要在settings.py文件中添加如下:
settings.py

....
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'core',
]

现在,我们可以为我们的应用程序创建我们自己的命令,并通过在核心应用程序目录中创建一个management/commands目录将它们包含在列表中,如下所示:

example/                                   <-- project directory
 |-- core/                                <-- app directory
 |    |-- management/
 |    |    +-- commands/
 |    |         +-- my_command.py  <-- your command...
 |    |-- migrations/
 |    |    +-- __init__.py
 |    |-- __init__.py
 |    |-- admin.py
 |    |-- apps.py
 |    |-- models.py
 |    |-- tests.py
 |    +-- views.py
 |-- example/
 |    |-- __init__.py
 |    |-- settings.py
 |    |-- urls.py
 |    |-- wsgi.py
 +-- manage.py

命令文件的名称将用于使用命令行实用程序调用。例如,如果我们的命令被称为my_command.py,那么我们将能够通过以下命令调用它:

python manage.py my_command

现在,像这样开始我们的基本 django 自定义命令..

因此,Django 管理命令由一个名为 Command 的类组成,该类继承自BaseCommand。命令代码应在handle()方法中定义,如下面的代码所示。 management/commands/current_time.py

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 Time now %s" % time)

看看我们如何命名我们的模块 current_time.py。该命令可以执行为:
输出

 It's Time now 10:30:49 

处理 Django 命令中的参数

因此,在本节中,我们需要讨论 django 命令中的参数,因此 django 自定义管理命令涉及很多参数,例如位置参数、可选参数、标志参数、django 中的任意参数列表。
位置参数

首先我们需要谈谈django中的位置参数这个例子是一个创建随机用户实例的命令。它需要一个名为 total 的强制参数,它将定义该命令将创建的用户数。
management/commands/create_users.py

from django.contrib.auth.models import User
from django.core.management.base import BaseCommand
from django.utils.crypto import get_random_string

class Command(BaseCommand):
    help = 'Create random users'

    def add_arguments(self, parser):
        parser.add_argument('total', type=int, help='Indicates the number of users to be created')

    def handle(self, *args, **kwargs):
        total = kwargs['total']
        for i in range(total):
            User.objects.create_user(username=get_random_string(), email='', password='123456')

看看我们如何命名我们的模块 create_users.py。该命令可以执行为:
输出

python manage.py create_users 10

可选参数

我们需要讨论的所有第二个参数可选参数在下面的示例中,您将找到一个名为“prefix”的参数的定义,它将用于组成用户名字段: management/commands/create_users.py

from django.contrib.auth.models import User
from django.core.management.base import BaseCommand
from django.utils.crypto import get_random_string

class Command(BaseCommand):
    help = 'Create random users'

    def add_arguments(self, parser):
        parser.add_argument('total', type=int, help='Indicates the number of users to be created')

        # Optional argument
        parser.add_argument('-p', '--prefix', type=str, help='Define a username prefix', )

    def handle(self, *args, **kwargs):
        total = kwargs['total']
        prefix = kwargs['prefix']

        for i in range(total):
            if prefix:
                username = '{prefix}_{random_string}'.format(prefix=prefix, random_string=get_random_string())
            else:
                username = get_random_string()
            User.objects.create_user(username=username, email='', password='123')

看看我们如何命名我们的模块 create_users.py。该命令可以执行为:
输出

python manage.py create_users 10 --prefix custom_user 10

或

python manage.py create_users 10 -p custom_user

输出

标志参数 Flag Arguments

我们需要讨论的第三个参数是用于处理布尔值的标志参数,我们要添加一个–admin标志,以指示我们的命令创建超级用户或在该标志不存在时创建普通用户。
management/commands/create_users.py

from django.contrib.auth.models import User
from django.core.management.base import BaseCommand
from django.utils.crypto import get_random_string

class Command(BaseCommand):
    help = 'Create random users'

    def add_arguments(self, parser):
        parser.add_argument('total', type=int, help='Indicates the number of users to be created')
        parser.add_argument('-p', '--prefix', type=str, help='Define a username prefix')
        parser.add_argument('-a', '--admin', action='store_true', help='Create an admin account')

    def handle(self, *args, **kwargs):
        total = kwargs['total']
        prefix = kwargs['prefix']
        admin = kwargs['admin']

        for i in range(total):
            if prefix:
                username = '{prefix}_{random_string}'.format(prefix=prefix, random_string=get_random_string())
            else:
                username = get_random_string()

            if admin:
                User.objects.create_superuser(username=username, email='', password='123')
            else:
                User.objects.create_user(username=username, email='', password='123')

看看我们如何命名我们的模块create_users.py。该命令可以执行为:
输出

python manage.py create_users 2 --admin

或

python manage.py create_users 2 -a

创建一个现在名为delete_users的新命令。在这个新命令中,我们将能够传递用户 ID 列表,并且该命令应该从数据库中删除这些用户。 management/commands/delete_users.py

from django.contrib.auth.models import User
from django.core.management.base import BaseCommand

class Command(BaseCommand):
    help = 'Delete users'

    def add_arguments(self, parser):
        parser.add_argument('user_id', nargs='+', type=int, help='User ID')

    def handle(self, *args, **kwargs):
        users_ids = kwargs['user_id']

        for user_id in users_ids:
            try:
                user = User.objects.get(pk=user_id)
                user.delete()
                self.stdout.write('User "%s (%s)" deleted with success!' % (user.username, user_id))
            except User.DoesNotExist:
                self.stdout.write('User with id "%s" does not exist.' % user_id)

看看我们如何命名我们的模块 create_users.py。该命令可以执行为:
输出

python manage.py delete_users 1 

or 

 User "1uTOXo4kyQOn (1)" deleted with success! 

我们还可以传递多个用空格分隔的 id,因此该命令将在一次调用中删除用户:

python manage.py delete_users 1 2 3

输出

User with id "1" does not exist.
User "TBYyzwCA8NBZ (2)" deleted with success!
User "VkasoEK0YYE2 (3)" deleted with success!
User "Yh83nwRgJrTY (4)" deleted with success!

定时任务

在这里,我将向您展示如何在服务器上设置 cron 作业命令。假设您有一个网络抓取工具,它每 10 分钟从某个网站收集数据。所以让我们运行下面的命令并为 cron 作业添加新条目。

# m h  dom mon dow   command
0 4 * * * /home/mysite/venv/bin/python /home/mysite/mysite/manage.py my_command

我希望它会帮助你……

how-to-create-custom-command-in-django

发表评论

邮箱地址不会被公开。 必填项已用*标注