如何将字典传递给通过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
我还有其他选择吗?
答案 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)
稍后您将能够轻松更改set
和get
的实施。例如,序列化并存储到Redis,分别从Redis获取和反序列化。它还可以更容易地进行测试。