将dict传递给通过Flask调用的函数

时间:2016-03-20 18:51:05

标签: python flask

如何将字典传递给通过Flask POST请求调用的python 2.7函数,该函数不是从URL(或通过POST请求入站)派生的,而是在我的脚本中的其他地方生成的,例如:

@app.route('/url_route', methods=['POST'])
def my_function(foo, bar):
    baz = foo + bar # both are 'internal' variables, e.g. not via POST

    (do other stuff with inbound data from POST request)

    return baz, other stuff

当我尝试通过POST请求触发my_function时出现错误:

my_function() takes exactly 2 arguments (0 given)

我知道可以通过宣布它们都是全局的来避免这种情况,例如

def my_function(foo, bar):
    global foo
    global bar

    baz = foo + bar

我还有其他选择吗?

1 个答案:

答案 0 :(得分:1)

如果它们是常量,IMO全局变量就可以了。

如果你必须运行一些代码来生成值,我会定义方法(并且可能将它们放在另一个模块中,如果要重用它们),我可以从my_function调用它们。实际上,即使是常数,你也可以用一个简单的函数来抽象它们。

def foo():
    # compute and return value

def bar():
    # compute and return value 

def my_function():    
    baz = foo() + bar()

此外,如果您想缓存数据库连接等资源,那么烧瓶中的应用程序上下文可能会有所帮助

阅读原始问题的评论后进行修改

你应该真正使用键值存储,也可以考虑使用flask-session: https://pythonhosted.org/Flask-Session/ 否则,您不仅会遇到多线程问题(可以使用锁定修复),而且只要运行两个工作进程就会出现多进程问题 - 一个请求可能会在一个进程中保存数据,但下一个请求可能会出现在不同的。

如果你真的想这样做 仅用于原型设计 ,我建议你至少抽象一下对用户数据的访问,而不是暴露原始字典。一个简单的方法是这样的:

class FooStore(object):

    FOO = {}

    @classmethod
    def get(cls, user_id):
        return FOO.get(user_id)

    @classmethod
    def set(cls, user_id, value):
        return cls.FOO[user_id] = value

# Access/set the values
FooStore.set(1, {'data': 'some user data'})
FooStore.get(1)

稍后您将能够轻松更改setget的实施。例如,序列化并存储到Redis,分别从Redis获取和反序列化。它还可以更容易地进行测试。