0
点赞
收藏
分享

微信扫一扫

偷懒向,制作flask初始化脚本

A邱凌 2022-02-01 阅读 32

如何给python脚本传参

1.sys.argv

sys模块是很常用的模块, 它封装了与python解释器相关的数据,例如sys.modules里面有已经加载了的所有模块信息,sys.path里面是PYTHONPATH的内容,而sys.argv则封装了传入的参数数据。

import sys
gpus = sys.argv[1]
batch_size = sys.argv[2]
print(gpus)
print(batch_size)

在这里插入图片描述

2.argparse

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--gpus", type=str, default="0")
parser.add_argument("--batch-size", type=int, default=32)
args = parser.parse_args()
print(args.gpus)
print(args.batch_size)

脚本运行命令python script.py -gpus=0,1,2 --batch-size=10中的–batch-size会被自动解析成batch_size.

parser.add_argument 方法的type参数理论上可以是任何合法的类型, 但有些参数传入格式比较麻烦,例如list,所以一般使用bool, int, str, float这些基本类型就行了,更复杂的需求可以通过str传入,然后手动解析。

bool类型的解析比较特殊,传入任何值都会被解析成True,传入空值时才为False
在这里插入图片描述

制作脚本

接收两个参数,项目名必传,app名不传默认为web!

将自己项目布局习惯写入即可

import argparse
import os

parser = argparse.ArgumentParser()
parser.add_argument("--name", type=str)
parser.add_argument('--app', type=str, default='web')
args = parser.parse_args()

name = args.name
app_name = args.app
os.mkdir(f'./{name}')

# 创建app
os.mkdir(f'./{name}/{app_name}')
os.mkdir(f'./{name}/{app_name}/templates')
os.mkdir(f'./{name}/{app_name}/static')
os.mkdir(f'./{name}/{app_name}/static/js')
os.mkdir(f'./{name}/{app_name}/static/css')
os.mkdir(f'./{name}/{app_name}/static/fonts')

# 创建manage.py
manage_content = f"""
from gevent import monkey;monkey.patch_all()
from {app_name} import create_app, db, models
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand

app = create_app()
manager = Manager(app)
Migrate(app=app, db=db)
manager.add_command('db', MigrateCommand)


@manager.command
def runserver_gevent():
    from gevent import pywsgi
    server = pywsgi.WSGIServer(("127.0.0.1", 5000), app)
    server.serve_forever()


if __name__ == '__main__':
    manager.run()
"""
with open(f'./{name}/manage.py', 'w', encoding='utf-8') as f:
    f.write(manage_content)

# 创建settings.py
settings_content = f"""
from redis import Redis
from datetime import timedelta
import os
import sys

class Config:
    DEBUG = True
    TESTING = False
    SECRET_KEY = ''
    SESSION_REFRESH_EACH_REQUEST = True
    SESSION_TYPE = 'redis'

    # sqlalchemy配置
    SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://user:password@ip:port/database?charset=utf8'
    SQLALCHEMY_POOL_SIZE = 5
    SQLALCHEMY_POOL_TIMEOUT = 30
    SQLALCHEMY_POOL_RECYCLE = -1
    SQLALCHEMY_MAX_OVERFLOW = 0
    SQLALCHEMY_TRACK_MODIFICATIONS = True

    BASE_DIR = os.path.dirname(os.path.abspath(__file__))
    sys.path.insert(0, BASE_DIR)
    print(os.path.join(BASE_DIR, {app_name}))
    sys.path.insert(1, os.path.join(BASE_DIR, {app_name}))


class ProductionConfig(Config):
    DEBUG = False
    # SESSION_REDIS = Redis(host=..., port=...)
    # PERMANENT_SESSION_LIFETIME = timedelta(days=7)
    SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://user:password@ip:port/database?charset=utf8'


class DevelopmentConfig(Config):
    # PERMANENT_SESSION_LIFETIME = timedelta(days=1)
    # SESSION_REDIS = Redis(host='127.0.0.1', port=6379)
    pass


class TestingConfig(Config):
    TESTING = True
    DEBUG = False
"""
with open(f'./{name}/settings.py', 'w', encoding='utf-8') as f:
    f.write(settings_content)

# 创建app/__init__.py
app_content = f"""
from flask import Flask
from flask_session import Session
from {app_name}.ext import db


def create_app():
    app = Flask(__name__)
    app.config.from_object('settings.DevelopmentConfig')
    Session(app)
    db.init_app(app)
    return app
"""
with open(f'./{name}/{app_name}/__init__.py', 'w', encoding='utf-8') as f:
    f.write(app_content)

# 创建app/ext.py
ext_content = """
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()
"""
with open(f'./{name}/{app_name}/ext.py', 'w', encoding='utf-8') as f:
    f.write(ext_content)

# 创建app/views.py & app/models.py
with open(f'./{name}/{app_name}/views.py', 'w', encoding='utf-8') as f:
    f.write('# writing your view here!')

with open(f'./{name}/{app_name}/models.py', 'w', encoding='utf-8') as f:
    f.write('# writing your db class here!')

执行:python flask-admin.py --name django恶搞一下!
在这里插入图片描述
生成目录结构如下:
在这里插入图片描述

举报

相关推荐

0 条评论