python web项目中经常会使用到脚本,一般来说有两种很简单的方法,一种是直接python function,另一种就是 django 自定义command。
这里举个简单的例子,比如初始化数据、文件名称为initialize_data.py
(1)使用方式1:
- from django.utils import timezone
- from your_app.models import Your_model
-
- def initialize_data():
- unit_data = [
- {
- 'name': 'Tom',
- 'age': 12,
- },
- {
- 'name': 'Jerry',
- 'age': 23,
- }
- ]
-
- Your_model.objects.bulk_create(Your_model(**data))
-
- # 调用初始化函数
- initialize_data()
(2)使用方式2(web开发推荐),用BaseCommand(使用from django.core.management.base import BaseCommand可以创建一个自定义的Django管理命令,以便更好地组织和管理脚本):
- from django.core.management.base import BaseCommand
- from django.utils import timezone
- from your_app.models import Your_model
-
- class Command(BaseCommand):
- help = 'Initialize data'
-
- def handle(self, *args, **options):
- unit_data = [
- {
- 'name': 'Tom',
- 'age': 12,
- },
- {
- 'name': 'Jerry',
- 'age': 23,
- }
- ]
- Your_model.objects.bulk_create(Your_model(**data))
通过继承BaseCommand类并实现handle方法,我们可以将脚本逻辑放在handle方法中。然后,我们可以在命令行中运行python manage.py initialize_data来执行该命令。
优势:
BaseCommand可以将脚本逻辑封装为一个自定义的Django管理命令,使代码更加模块化和可维护。BaseCommand提供了处理命令行参数的功能,可以通过命令行传递参数给脚本。BaseCommand可以直接访问Django的模型和其他功能,无需额外的配置。劣势:
BaseCommand需要创建一个自定义的管理命令,并在命令行中运行该命令。这里讲一下命令行参数。
注:Command类名是用于自定义管理命令的约定,但你可以选择其他名称,只需确保继承自BaseCommand类即可
- from django.core.management.base import BaseCommand
- from your_app.models import YourModel
-
- class Command(BaseCommand):
- help = 'Initialize data'
-
- def add_arguments(self, parser):
- parser.add_argument('--name', type=str, help='Set name value')
- parser.add_argument('--age', type=int, help='Set age value')
-
- def handle(self, *args, **options):
- name = options['name']
- age = options['age']
-
- if name and age:
- YourModel.objects.create(name=name, age=age)
- else:
- 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两个参数,分别用于设置name和age的值,并提供了帮助文本。在handle方法中,我们通过options['name']和options['age']来获取命令行参数的值,并根据这些值创建YourModel实例。
在执行脚本时,往往要注意安全性、可拓展性。
(1)安全性,如批量修改、多表修改信息,这时候需要加事务保障数据安全;同时注意异常捕获,打印日志检查;
(2)可拓展性,编写脚本往往我们还希望做到后续可拓展,可用,命令行参数就可以实现这个性质。