Flask笔记-任务框架搭建

这个是个很好的结构,如下:

先贴下代码:

base_setting.py

DEBUG = True

local_setting.py

local_setting.py

production_setting.py

from config.base_setting import *

DEBUG = False

test.py


class JobTask():
    def __init__(self):
        pass

    def run(self, params):
        print("Job测试打印")
        print(params)
        pass
    

launcher.py

from flask_script import Command
import sys, argparse, traceback, importlib

'''
Job统一入口文件
python manager.py runjob -m Test
python manager.py runjob -m test/index

第一个jobs/tasks/Test.py
第二个jobs/tasks/test/index.py
'''

class runJob(Command):

    capture_all_args = True     #flask_script有一个未记录的capture_all_flags flag,它将把剩余的参数传递给Command.run方法
    def run(self, *args, **kwargs):
        args = sys.argv[2:]
        print(args)
        parser = argparse.ArgumentParser(add_help=True)
        parser.add_argument("-m", "--name", dest="name", metavar="name", help="指定job名", required=True)
        parser.add_argument("-a", "--act", dest="act", metavar="act", help="Job动作", required=False)
        parser.add_argument("-p", "--param", dest="param", nargs="*", metavar="param", help="业务参数", required=False)

        params = parser.parse_args(args)
        params_dict = params.__dict__
        print(params)
        print(params_dict)

        if "name" not in params_dict or not params_dict['name']:
            return self.tips()

        try:
            '''
            类似java的反射,导入包
            from jobs.xxx.xxx import JobTask
            '''
            module_name = params_dict['name'].replace("/", ".")
            import_string = "jobs.tasks.%s" % (module_name)
            target = importlib.import_module(import_string)
            exit(target.JobTask().run(params_dict))
        except Exception as e:
            traceback.print_exc()
        pass

    def tips(self):
        tip_msg = '''
        请正确的调度Job
        python manager.py runjob -m test ( jobs/tasks/test.py )
        python manager.py runjob -m test/index ( jobs/tasks/test/index.py )
        '''
        print( tip_msg )
        return

    pass

application.py

from flask import Flask
from flask_script import Manager
import os

app = Flask(__name__)

manager = Manager(app)

app.config.from_pyfile("config/base_setting.py")
if "ops_config" in os.environ:
    app.config.from_pyfile("config/%s_setting.py" % (os.environ['ops_config']))
    pass

manager.py

from flask_script import Server, Command
from application import app, manager
from jobs.launcher import runJob

manager.add_command("runjob", runJob)

def main():
    manager.run()
    pass

if __name__ == "__main__":
    try:
        import sys
        sys.exit(main())
        pass
    except Exception as e:
        import traceback
        traceback.print_exc()
        pass
    pass

requirement.txt

flask
flask-script
apscheduler
Flask-APScheduler
requests
BeautifulSoup4

程序是这样运行的,如下:

requirement.txt是库文件,在部署开发环境时,这样使用:

pip install -r requirement.txt

manager.py是主要的管理类。程序的入口。

application.py为核心程序,管理Flask中的app,和flask_script的Manager,并且加载config下的配置文件。

这里开发环境会加载:

base_setting.py + local_setting.py

生产环境会加载:

base_setting.py + production_setting.py

launcher.py为任务的入口文件,主要是管理参数方面的问题。

在jobs文件夹下的tasks为具体的任务文件。 

发布了1312 篇原创文章 · 获赞 2429 · 访问量 185万+

猜你喜欢

转载自blog.csdn.net/qq78442761/article/details/104725575