添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

Python文件使用python命令运行,但不使用Flask

1 人关注

我有一个小的应用程序,使用Flask和 泡沫-restx .我可以使用 python app.py 来运行应用程序,并且flask服务器运行在8888端口。我尝试用 set FLASK_APP=app.py 运行文件,用 flask run 运行,似乎可以运行,但不能打开我的swagger页面。请指教。

app.py

import logging.config
import os
from flask import Flask, Blueprint
from flask_cors import CORS
from werkzeug.middleware.proxy_fix import ProxyFix
from src.config import default
from src.api.controllers.endpoints.users import ns as users_namespace
from src.api.controllers.endpoints.statuses import ns as status_namespace
from src.api import api
from src.database import db
app = Flask(__name__)
CORS(app)
app.wsgi_app = ProxyFix(app.wsgi_app)
logging_conf_path = os.path.normpath(os.path.join(os.path.dirname(__file__), '../logging.conf'))
logging.config.fileConfig(logging_conf_path)
log = logging.getLogger(__name__)
def configure_app(flask_app):
    flask_app.config['SERVER_NAME'] = default.FLASK_SERVER_NAME
    flask_app.config['SQLALCHEMY_DATABASE_URI'] = default.SQLALCHEMY_DATABASE_URI
    flask_app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = default.SQLALCHEMY_TRACK_MODIFICATIONS
    flask_app.config['SWAGGER_UI_DOC_EXPANSION'] = default.RESTPLUS_SWAGGER_UI_DOC_EXPANSION
    flask_app.config['RESTPLUS_VALIDATE'] = default.RESTPLUS_VALIDATE
    flask_app.config['RESTPLUS_MASK_SWAGGER'] = default.RESTPLUS_MASK_SWAGGER
    flask_app.config['ERROR_404_HELP'] = default.RESTPLUS_ERROR_404_HELP
def initialize_app(flask_app):
    configure_app(flask_app)
    blueprint = Blueprint('CovidAPI', __name__, url_prefix='/')
    api.init_app(blueprint)
    api.add_namespace(users_namespace)
    api.add_namespace(status_namespace)
    flask_app.register_blueprint(blueprint)
    db.init_app(flask_app)
def main():
    initialize_app(app)
    log.info('>>>>> Starting development server at http://{}/ <<<<<'.format(app.config['SERVER_NAME']))
    app.run(debug=default.FLASK_DEBUG)
if __name__ == "__main__":
    main()

烧瓶设置。

# Flask settings
FLASK_SERVER_NAME = 'localhost:8888'
FLASK_DEBUG = True  # Do not use debug mode in production
# Flask-Restplus settings
RESTPLUS_SWAGGER_UI_DOC_EXPANSION = 'list'
RESTPLUS_VALIDATE = True
RESTPLUS_MASK_SWAGGER = False
RESTPLUS_ERROR_404_HELP = False

使用python命令输出。

2020-04-29 10:25:42,519 - __main__ - INFO - >>>>> Starting development server at http://localhost:8888/ <<<<<
 * Serving Flask app "app" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: on
2020-04-29 10:25:42,610 - werkzeug - INFO -  * Restarting with stat
2020-04-29 10:25:45,398 - __main__ - INFO - >>>>> Starting development server at http://localhost:8888/ <<<<<
2020-04-29 10:25:45,426 - werkzeug - WARNING -  * Debugger is active!
2020-04-29 10:25:45,458 - werkzeug - INFO -  * Debugger PIN: 258-749-652
2020-04-29 10:25:45,530 - werkzeug - INFO -  * Running on http://localhost:8888/ (Press CTRL+C to quit)

通过烧瓶运行。

 * Serving Flask app "src\app.py" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 313-115-045
 * Running on http://localhost:6000/ (Press CTRL+C to quit)
    
python
flask
flask-restplus
a2441918
a2441918
发布于 2020-04-29
1 个回答
v25
v25
发布于 2020-04-29
已采纳
0 人赞同

flask run 命令通过从你的 app.py 模块中导入一个 app 对象来工作。

因此,在这种情况下,这个函数中的内容永远不会被执行。

def main():
    initialize_app(app)
    log.info('>>>>> Starting development server at http://{}/ <<<<<'.format(app.config['SERVER_NAME']))
    app.run(debug=default.FLASK_DEBUG)

当用python app.py命令运行时,它是,因为这被执行。

if __name__ == "__main__":
    main()

我不确定在你的情况下如何完全运行python,因为configure_appinitialize_app函数都没有返回应用程序对象。 然而,你可能希望将代码改为类似的内容。

# ...
def configure_app(flask_app):
    # ...
    return flask_app
def initialize_app(flask_app):
    # ...
    return flask_app
app = initialize_app(app)

现在,那个(完全配置好的)app对象是可以提供给flask run的。你应该不需要设置FLASK_ENV环境变量,因为它默认会寻找一个叫做app的对象。

如果你仍然希望能够与解释器一起运行,那么就把这个块加到最后,尽管如果使用flask命令,这个块就有点不适用了。