Flask:如何从使用@ app.route装饰器的函数中获取返回值?

时间:2014-11-12 17:42:37

标签: python oauth flask return

所以我对Flask很陌生,我试图围绕一件事情。所以,如果我在Flask应用程序中编写函数并且在该函数中使用@ app.route装饰器时我理解得很清楚,那么它只会在您触及该路径/ url时运行。

我有一个用Flask编写的小型oauth应用程序,它遍历所有授权流程,然后返回令牌。

我的问题是如何从@decorated函数中获取该令牌?例如,假设我有这样的事情:

@app.route(/token/)
def getToken(code): #code from the callback url.
    #/Stuff to get the Token/
    #/**********************/
    return token

如果我点击(/ token /)url-path,该函数将返回令牌。但是现在我需要获取该令牌并在另一个函数中使用它来编写和读取我刚刚获得令牌的API。我最初的想法是这样做:

token = getToken(code)

但如果我这样做,我会收到此错误:

RuntimeError: working outside of request context

所以,我的问题是,如何获取令牌,以便将其作为参数传递给其他函数。

2 个答案:

答案 0 :(得分:2)

将令牌生成代码提取到单独的函数中,以便您可以从任何地方调用它,包括视图函数。将应用程序逻辑远离视图是一种很好的做法,它也有助于单元测试。

我假设您的路线包含代码的占位符,您跳过了:

def generateToken(code):
    #/Stuff to get the Token/
    #/**********************/
    return token

@app.route('/token/<string:code>')
def getToken(code):
    return generateToken(code)

请注意generateToken不应该依赖request对象。如果您需要任何请求数据(例如HTTP标头),则应在参数中显式传递。否则,您将获得&#34;在请求上下文之外工作&#34;你提到的例外。

可以直接调用依赖于请求的视图,但是您需要模拟请求对象,这有点棘手。阅读the request context documentation了解详情。

答案 1 :(得分:0)

不确定上下文是什么。你可以调用这个方法。

from yourmodule import get_token

def yourmethod():
  token = get_token()

否则,您可以使用requests库来检索路径中的数据

>>> import requests
>>> response = requests.get('www.yoursite.com/yourroute/')
>>> print response.text

如果您正在寻找单元测试,Flask会附带模拟client

def test_get_token():
  resp = self.app.get('/yourroute')
  # do something with resp.data
相关问题