Python 如何在路由函数中启用仅适用于开发人员的行为

Python 如何在路由函数中启用仅适用于开发人员的行为,python,flask,Python,Flask,我希望能够在使用@app.route修饰的函数中定义或多或少的任意更改,这些更改只能由非生产服务器运行。实现我的意思的一种直接方法是将仅开发人员的更改放入检查当前环境的if块中: 导入烧瓶 app=烧瓶。烧瓶(\uuuuu名称\uuuuuuu) @app.route('/check',methods=['POST']) def check(): “”“对给定的请求数据执行某种检查。”“” #此if块将限制仅开发/测试/审阅行为 如果app.config['ENV']!='生产': #如果需要,让

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

导入烧瓶
app=烧瓶。烧瓶(\uuuuu名称\uuuuuuu)
@app.route('/check',methods=['POST'])
def check():
“”“对给定的请求数据执行某种检查。”“”
#此if块将限制仅开发/测试/审阅行为
如果app.config['ENV']!='生产':
#如果需要,让测试仪短路逻辑
如果flask.request.json['payload']=='给我一个ok':
返回烧瓶。jsonify('ok')
#在生产环境或测试环境中运行的唯一代码
#想要运行完整的逻辑吗
实际结果=某些复杂逻辑()
返回烧瓶.jsonify(实际结果)
但是这种方法的缺点是,在入口点的核心有一个本质上是大规模利用的东西,在代码的生命周期中将经历很多更改,这对我来说有点风险

我一直在考虑的另一种方法是使用条件包装器来添加测试功能。它将避免在实际代码中包含测试代码,并且在
ENV!=生产
,使服务器明显不安全。这里的缺点是堆栈跟踪看起来略有不同


要将所有约束集合在一个简短列表中,请执行以下操作:

  • 我不想完全替换函数,所以mock不行
  • 我不想向请求主体添加特殊的仅测试参数
  • 我不想在我的测试和生产服务器上部署不同的构建,只有配置(即
    ENV
    将是
    production
    或其他不同的配置)应该是不同的
  • 产生期望结果的罐装请求不够好-一些复杂逻辑的逻辑发生了变化,API也发生了变化,最重要的是它有点随机
  • 我不是在说设置,我想要一个真正的服务器运行并由人测试
最理想的情况是,我应该遵循一种不同的编程范式,或者是一种我没能在谷歌上找到的中间件,它可以很好地处理这个问题,而且没有风险


编辑:


我最后写了一篇文章,发布了这个问题的一个广义变体。感谢@vulpxn推荐decorator表单,@davidism链接到其他信息(首先,Decorators是您的朋友)

从烧瓶导入烧瓶
从functools导入包装
app=烧瓶(名称)
def开发快捷方式(f):
@包装(f)
def包裹(*args,**kwargs):
如果app.env==“生产”:
#继续执行/检查路由逻辑
返回f(*args,**kwargs)
其他:
#非生产,跳过逻辑
返回“刚刚给出一个OK”,200
回程包装
@应用程序路径(“/检查”)
@发展捷径
def check():
#你的代码在这里
返回“昂贵的操作”,200
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
app.env='development'#更改此值以查看其工作情况
app.run()

Nifty,我喜欢这种方法。它甚至可以通过向其中传递一个参数来进行推广,该参数可以用作条件->结果映射。没错。如果您希望使用它执行任何条件操作,则可以在包装函数中访问请求对象,而无需显式传递它。