如何连续多次连接到Shapeways.com的API?

时间:2016-02-29 00:15:06

标签: python api flask

我正在开发一个Python Web应用程序并使用Flask框架与Shapeways.com的API进行通信。我使用module provided by Shapeways进行连接。我可以使用the module's docs中的以下步骤进行身份验证(API使用OAuth v1):

  1. 创建客户
  2. 连接到API并获取请求令牌和身份验证网址
  3. 将用户发送到身份验证网址
  4. 验证来自身份验证网址的回调
  5. 然后,我可以上传3D模型并从用户帐户中的现有模型中读取数据。

    但是,如果我在连接后刷新页面,我将无法再从模块的connect()方法中获取网址。在获取新URL之前,我必须重新启动脚本(或在使用mod_wsgi时重新启动Apache)。这是一个精简的例子:

    from flask import Flask, request, redirect
    from urllib.parse import urlencode
    import urllib.parse
    from shapeways.client import Client
    
    consumer_key = [my app's key]
    consumer_secret = [my app's secret]
    callback_url = "http://127.0.0.1:5000/callback"
    client = Client(consumer_key, consumer_secret, callback_url)
    
    app = Flask(__name__)
    
    app.debug = True
    app.secret_key = "FZ\x96\xf0\x94\xa0:\xe2\x9a&\x88\xc3\x1c\xdf\xfc\x83`gw.\xab\x83\xf1d"
    
    @app.route("/")
    def root():
        url = client.connect()
        return redirect(url, code=302)
    
    @app.route("/callback")
    def callback():
        oauth_token = request.args.get("oauth_token", 0, type=str)
        oauth_verifier = request.args.get("oauth_verifier", 0, type=str)
        client.verify(oauth_token, oauth_verifier)
        info = client.get_api_info()
        return str(info)
    
    if __name__ == "__main__":
        app.run(debug=True)
    

    我第一次加载页面时,connect()从API获取请求令牌和URL,并将我重定向到Shapeways.com,我在那里登录并授予权限。该页面然后重定向到回调URL,在那里进行验证。

    如果我重新加载页面,client.connect()会返回None。如果我尝试从其他浏览器访问该页面,也会发生同样的事情。

    我是否错误地使用了API(或Flask)?我应该更改什么来阻止应用程序仅允许单个用户登录?我还可以尝试调试这个问题吗?

1 个答案:

答案 0 :(得分:0)

看起来Shapeways Client构建了一个单独的客户端,您正在为此做OAuth舞蹈。因此,您不应期望每次“连接”时都会构建新客户端,已经建立并验证了单个客户端,并且Shapeways希望您重用该客户端与其API进行通信。