• Django command执行脚本


    python web项目中经常会使用到脚本,一般来说有两种很简单的方法,一种是直接python function,另一种就是 django 自定义command。

    对比常规脚本

    这里举个简单的例子,比如初始化数据、文件名称为initialize_data.py

    (1)使用方式1:

    1. from django.utils import timezone
    2. from your_app.models import Your_model
    3. def initialize_data():
    4. unit_data = [
    5. {
    6. 'name': 'Tom',
    7. 'age': 12,
    8. },
    9. {
    10. 'name': 'Jerry',
    11. 'age': 23,
    12. }
    13. ]
    14. Your_model.objects.bulk_create(Your_model(**data))
    15. # 调用初始化函数
    16. initialize_data()

    (2)使用方式2(web开发推荐),用BaseCommand(使用from django.core.management.base import BaseCommand可以创建一个自定义的Django管理命令,以便更好地组织和管理脚本):

    1. from django.core.management.base import BaseCommand
    2. from django.utils import timezone
    3. from your_app.models import Your_model
    4. class Command(BaseCommand):
    5. help = 'Initialize data'
    6. def handle(self, *args, **options):
    7. unit_data = [
    8. {
    9. 'name': 'Tom',
    10. 'age': 12,
    11. },
    12. {
    13. 'name': 'Jerry',
    14. 'age': 23,
    15. }
    16. ]
    17. Your_model.objects.bulk_create(Your_model(**data))

    通过继承BaseCommand类并实现handle方法,我们可以将脚本逻辑放在handle方法中。然后,我们可以在命令行中运行python manage.py initialize_data来执行该命令。

    优势:

    1. 更好的组织和管理:使用BaseCommand可以将脚本逻辑封装为一个自定义的Django管理命令,使代码更加模块化和可维护。
    2. 支持命令行参数:BaseCommand提供了处理命令行参数的功能,可以通过命令行传递参数给脚本。
    3. 集成Django环境:使用BaseCommand可以直接访问Django的模型和其他功能,无需额外的配置。

    劣势:

    1. 需要创建一个管理命令:相比直接运行脚本文件,使用BaseCommand需要创建一个自定义的管理命令,并在命令行中运行该命令。


    命令行参数

    这里讲一下命令行参数。

    注:Command类名是用于自定义管理命令的约定,但你可以选择其他名称,只需确保继承自BaseCommand类即可

    1. from django.core.management.base import BaseCommand
    2. from your_app.models import YourModel
    3. class Command(BaseCommand):
    4. help = 'Initialize data'
    5. def add_arguments(self, parser):
    6. parser.add_argument('--name', type=str, help='Set name value')
    7. parser.add_argument('--age', type=int, help='Set age value')
    8. def handle(self, *args, **options):
    9. name = options['name']
    10. age = options['age']
    11. if name and age:
    12. YourModel.objects.create(name=name, age=age)
    13. else:
    14. self.stdout.write(self.style.ERROR('Please provide both name and age values.'))

    运行以下指令即可创建:

    python manage.py initialize_data --name Tom --age 1

            使用add_arguments方法来定义命令行参数。在这个示例中,添加了--name--age两个参数,分别用于设置nameage的值,并提供了帮助文本。在handle方法中,我们通过options['name']options['age']来获取命令行参数的值,并根据这些值创建YourModel实例。

    其他

    在执行脚本时,往往要注意安全性、可拓展性。

            (1)安全性,如批量修改、多表修改信息,这时候需要加事务保障数据安全;同时注意异常捕获,打印日志检查;

            (2)可拓展性,编写脚本往往我们还希望做到后续可拓展,可用,命令行参数就可以实现这个性质。

            

  • 相关阅读:
    虾皮之家数据分析插件:知虾数据分析工具提升销量的利器
    3.生成验证码 + 开发登录、退出功能 + 显示登录信息
    python 本地降级pip
    Java dom4j类简介说明
    从ReentrantLock角度解析AQS
    肖sir___面试就业课程____app
    Programming Differential Privacy第十五章Synthetic Data合成数据
    数据清洗与规范化详解
    SGU 176 Flow construction 有源汇 有上下界的最小流
    Docker consul
  • 原文地址:https://blog.csdn.net/lxd_max/article/details/134464829