如何在路由功能中启用仅限开发人员的行为

@app.route我希望能够在可能仅由非生产服务器运行的修饰函数中定义或多或少的任意更改。实现我的意思的直接方法是将仅用于开发的更改放入检查当前环境的 if 块中:


import flask


app = 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 😊)。


牛魔王的故事
浏览 91回答 1
1回答

慕的地8271018

装饰师是你的朋友。from flask import Flaskfrom functools import wrapsapp = 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_shortcutdef check():    # your code here    return 'Expensive Operation', 200if __name__ == '__main__':    app.env = 'development'  #change this value to see it work    app.run()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python