@app.route我希望能够在可能仅由非生产服务器运行的修饰函数中定义或多或少的任意更改。实现我的意思的直接方法是将仅用于开发的更改放入检查当前环境的 if 块中:import flaskapp = flask.Flask(__name__)@app.route('/check', methods=['POST'])def check(): """Performs some kind of check on the given request data.""" # this if-block gates the dev/test/review-only behavior if app.config['ENV'] != 'production': # let a tester short-circuit the logic if they want if flask.request.json['payload'] == 'just give me an ok': return flask.jsonify('ok') # the only code that runs in production, or in tests where I # want the full logic to run actual_result = some_complex_logic() return flask.jsonify(actual_result)但是这种方法的缺点是,在入口点的核心处有一个本质上是大规模利用的东西,在代码的生命周期中会经历很多变化,这对我来说有点冒险。我一直在考虑的另一种方法是使用添加测试功能的条件包装器。它将避免在实际代码中包含测试代码,并且可能会在启动期间打印大红色警告消息,ENV != production以表明服务器不安全。这里的缺点是堆栈跟踪看起来会略有不同。要将所有约束放在一个简短的列表中:我不想完全替换功能,所以模拟不会做我不想在请求正文中添加特殊的仅测试参数我不想在我的测试和生产服务器上部署不同的构建,只有配置(即ENV要么是要么production不同)应该不同产生所需结果的罐头请求还不够好 - 更改的逻辑some_complex_logic、API 更改,最重要的是它有点随机我不是在谈论设置测试客户端,我想要一个实际的服务器运行并由人类测试最理想的情况是,我应该遵循不同的编程范式,或者可能是我未能通过谷歌搜索的中间件,它可以很好地处理这个并且没有风险。编辑:我最终编写并发布了这个问题的通用变体Flask-Shortcut。感谢@vulpxn 建议装饰器表单,感谢@davidism 链接到其他信息(并首先维护 Flask 😊)。
1 回答
慕的地8271018
TA贡献1796条经验 获得超4个赞
装饰师是你的朋友。
from flask import Flask
from functools import wraps
app = Flask(__name__)
def development_shortcut(f):
@wraps(f)
def wrap(*args, **kwargs):
if app.env == 'production':
# Continue on to the /check route logic
return f(*args, **kwargs)
else:
# Non-production, skip the logic
return 'Just Giving an OK', 200
return wrap
@app.route('/check')
@development_shortcut
def check():
# your code here
return 'Expensive Operation', 200
if __name__ == '__main__':
app.env = 'development' #change this value to see it work
app.run()
添加回答
举报
0/150
提交
取消