Flask自定义命令
一、老版Flask自定义命令
Flask 1.x 和 2.x 版本
在Flask的老版本中,可以通过 flask-script
扩展来添加自定义命令。
-
安装所需库:
pip3 install Flask-Script==2.0.3 pip3 install flask==1.1.4 pip3 install markupsafe=1.1.1
-
在 Flask 应用中创建一个
Manager
对象,并使用装饰器定义自定义命令:from flask_script import Manager manager = Manager(app)@manager.command def custom(arg):print(arg)
-
运行自定义命令:
python manage.py custom 123
二、Flask 新版本(2.x 及以后)
Flask 新版本通过内置的 click
模块支持自定义命令,不再需要 flask-script
:
-
使用
click
装饰器定义命令:from flask import Flask import clickapp = Flask(__name__)@app.cli.command("create-user") @click.argument("name") def create_user(name):print(name)
-
运行自定义命令:
flask --app 文件名:app create-user bruce
如果你的脚本文件名为
app.py
,则可以简化命令为:flask create-user lqz
三、flask自定义命令示例
-
要求:制定一个flask命令,导入一个excel,把数据同步到 user表中
-
代码示例
-
from flask import Flask, current_app import click import pymysql from openpyxl import load_workbookapp = Flask(__name__)@app.cli.command("import_excel") @click.argument("excel_path") def import_excel(excel_path):"""将指定路径的 Excel 文件数据导入到 user 表中"""# 加载 Excel 文件workbook = load_workbook(filename=excel_path)sheet = workbook.active# 连接数据库connection = pymysql.connect(host='localhost',port=3306,user='root',password='000',database='test',cursorclass=pymysql.cursors.DictCursor)try:with connection.cursor() as cursor:for row in sheet.iter_rows(min_row=2, values_only=True): # 假设第一行为表头# 构造插入语句,假设 Excel 文件中有 'user'sql = "INSERT INTO user (name) VALUES (%s)"cursor.execute(sql, row)connection.commit()finally:connection.close()print(f"Excel 数据导入完成,文件:{excel_path}")if __name__ == '__main__':app.run()
-
四、Django自定义命令
Django允许在应用中创建自定义命令,步骤如下:
-
在应用目录下创建
management/commands
文件夹结构。 -
在
commands
文件夹中创建一个新的 Python 文件,该文件的名字将是你的命令名称。 -
在该文件中编写自定义命令的代码,继承
BaseCommand
类:from django.core.management.base import BaseCommandclass Command(BaseCommand):help = '命令提示'def add_arguments(self, parser):parser.add_argument('path', nargs='*', type=str)def handle(self, *args, **kwargs):print('开始导入')print(args)print(kwargs)
-
使用自定义命令:
python manage.py 文件名