首页 > 解决方案 > 在 i-framed 应用程序中使用 python 请求访问 URL 参数

问题描述

我正在开发一个需要使用第三方restful-API 的Django 应用程序。应用程序本身在通过 i-frame 中公开的门户进行身份验证后即可访问。当您在门户中选择应用程序时,它会重定向到应用程序 url 并附加一个 url 参数“?tokenid”。这需要检索才能使用需要将 tokenid 参数包含为 cookie 的第三方 API。

在我的应用程序中有一个 services.py 模块,我在其中构建了所有 API 方法来访问此第三方 API,例如:

url='https://www.fooapp.com'
token = request.get(url, 'tokenid')
cookies = {'session': token }

从主门户中单击应用程序链接时,响应会附加 tokenid 参数:

''https://www.fooapp.com/?tokenid=.eJwty8FqhDAQANB_mbMs2axmjKf-x1JkdCYyEGNxDK0s---V0uM7vBcoSzn0OGF4wb5lMRieMFXNrGUZVyq0yA6fDRznl8AA1S42UJUv5Kq26lIl36ZMRWwXO7bzo1RdKH_TeVOBdwNGax4LrTL-NXSRXJq4jeERKUjybY9eZMZpZu87xIgxCcP_NDHTrVz559rjTI-AQVzXchdSdM57h3Pn7yR9knvLGCj1kSnA-xcnjUmc.XNmOdg.hbtMmT5BkmOkhklP3JqgksDijhc''

那么使用一种 API 方法的功能之一是:

def get_foo():
    url = 'https://thirdparty.com/api/v0/foo/'
    r = requests.get(url, params=cookies)
    data = r.json()
    foos_dict = {foo['name']:foo['id'] for foo in data if 'name' in foo and 'id' in foo}
    return foo_dict

然后在我看来,我称之为这个函数等:

class Foo(generic.TemplateView):
    def get(self, request):
        foo_dict = services.get_foo()
        return render(request, 'foo.html', foo_dict)

我明白了

HTTPSConnectionPool(host='wwww.foo.com', port=443): Max retries exceeded with url: /?tokenid (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x000002261DFCCA20>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed',))

我也尝试过使用

import urllib.parse as urlparse
url = 'https://wwww.foo.com/'
parsed = urlparse.urlparse(url)
token = urlparse.parse_qs(parsed.query)['?tokenid']

没有成功。

有没有其他方法可以实现这一点。我在这里感到困惑。我认为我并没有真正得到的是,这个令牌 id 已经可以检索,因为我是门户内的用户,并且应用程序是从门户内调用的,所以不需要再次使用 request.get (??) . iframe 中的任何 url 都会附加该 ?tokenid 参数,并且有效期为一小时。知道有什么问题吗?

提前谢谢了

标签: djangoiframepython-requestsurl-parameters

解决方案


推荐阅读