【问题标题】:Modify request data before view functions in Flask API在 Flask API 中查看函数之前修改请求数据
【发布时间】:2019-11-24 11:43:56
【问题描述】:

在 Flask 中是否允许在视图函数之前修改请求 json 数据(例如在装饰器中)?甚至可能吗?想象这样的事情:

from functools import wraps
from flask import request, current_app

def my_function_decorator(func):
    @wraps(func)
    def decorated_function(*args, **kwargs):
        req = request.get_json()
        # do something to calculate the new value
        req["new key"] = "new value"
        request.set_json(req)

        return func(*args, **kwargs)

    return decorated_function 

目的是根据发送到我的服务的地址数据,对来自第三方服务的经纬度数据进行地理编码。不确定装饰器是否是正确的选择,或者它是否是 before_request,或者其他什么,或者什么都没有。

【问题讨论】:

标签: python json flask request


【解决方案1】:

我知道这是一个非常古老的问题,但是有些人从谷歌来到这里(比如我)。答案是:

from functools import wraps
from flask import Flask

from werkzeug.datastructures import ImmutableMultiDict

def my_function_decorator(func):
    @wraps(func)
    def decorated_function(*args, **kwargs):
        http_args = request.args.to_dict()
        http_args ['Shered Data'] = 'Hi!'

        request.args = ImmutableMultiDict(http_args )

        return func(*args, **kwargs)

    return decorated_function 

server = Flask(__name__)

@server.route('/')
@my_function_decorator
def index():
    #Now, request.args contains your data
    return 'It works! Shared data: %s' % (request.args.get('Shered Data'))

server.run(debug=True)

【讨论】:

  • 很棒的提示。我相信您也想将 *args 和 **kargs 传递到 func() 中,并且可能希望为正在扩充的临时 args 使用不同的名称,以避免遮蔽 args 参数。
猜你喜欢
  • 2014-03-05
  • 2017-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-27
  • 2015-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多