python web项目中经常会使用到脚本,一般来说有两种很简单的方法,一种是直接python function,另一种就是 django 自定义command。
对比常规脚本
这里举个简单的例子,比如初始化数据、文件名称为initialize_data.py
(1)使用方式1:
python
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管理命令,以便更好地组织和管理脚本):
python
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
提供了处理命令行参数的功能,可以通过命令行传递参数给脚本。 - 集成Django环境:使用
BaseCommand
可以直接访问Django的模型和其他功能,无需额外的配置。
劣势:
- 需要创建一个管理命令:相比直接运行脚本文件,使用
BaseCommand
需要创建一个自定义的管理命令,并在命令行中运行该命令。
命令行参数
这里讲一下命令行参数。
注:Command
类名是用于自定义管理命令的约定,但你可以选择其他名称,只需确保继承自BaseCommand
类即可
python
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
python manage.py initialize_data --name Tom --age 1
使用add_arguments
方法来定义命令行参数。在这个示例中,添加了--name
和--age
两个参数,分别用于设置name
和age
的值,并提供了帮助文本。在handle
方法中,我们通过options['name']
和options['age']
来获取命令行参数的值,并根据这些值创建YourModel
实例。
其他
在执行脚本时,往往要注意安全性、可拓展性。
(1)安全性,如批量修改、多表修改信息,这时候需要加事务保障数据安全;同时注意异常捕获,打印日志检查;
(2)可拓展性,编写脚本往往我们还希望做到后续可拓展,可用,命令行参数就可以实现这个性质。