2015-04-22 56 views
0

我正在使用提供给Valence的Python SDK的Python请求库来尝试执行GET请求。网址发生了一些奇怪的事情,我不确定是什么。我得到的响应是200(这导致我相信身份验证正在工作),但是当我尝试从Request对象打印JSON时,它会打印页面的HTML而不是JSON。Desire2Learn Valence API | JSON不加载

我使用的修改后的代码是从http://docs.valence.desire2learn.com/clients/python/auth.html中读取的。

这里的Python代码:

import requests 
import auth as d2lauth 
from auth import * 

app_creds = { 'app_id': '----', 'app_key': '----' } 

ac = d2lauth.fashion_app_context(app_id=app_creds['app_id'], app_key=app_creds['app_key']) 

auth_url = ac.create_url_for_authentication('ugatest2.view.usg.edu', 'http://localhost:8080') 

redirect_url = "https://localhost:8080?x_a=3----&x_b=3dMRgCBAHXJDTA2E6DJIfdWq-gYl-pk77fF_3X5oDUuqc" 

uc = ac.create_user_context(auth_url, 'ugatest2.view.usg.edu', True) 

route = 'ugatest2.view.usg.edu/d2l/api/versions/' 

url = uc.create_authenticated_url(route) 

r = requests.get(url) 

print(r.text) 

输出是一个页面,而不是JSON的HTML。如果我打印(r),我的状态为200.我认为我的重定向URL可能是问题,但我不确定究竟是什么错误。谢谢你的帮助!

回答

1

两个事情看起来关闭对我说:

  • 使用auth_url创建一个用户上下文行不通的,这就是你需要发送的用户,使他们能够验证URL。您需要在验证之后使用您重定向到的URL来构建用户上下文。假设redirect_url是该网址,则应将其传递给create_user_context而不是auth_url

  • ugatest2.view.usg.edu/d2l/api/versions/不适用于传递到create_authenticated_route,/d2l/api/versions可能是你想要的。 SDK将预先安排方案,域和端口,以便包括传入值中的那些内容将导致错误的URI。

+0

感谢您的帮助!因此,重定向网址就是我遇到问题的地方。当我将auth_url插入浏览器并按回车时,它会将我带到ugatest2的登录页面。该网址确实发生了变化,我已将其作为redirect_url插入。我注意到我的redirect_url不像本例中所示的localhost。当我使用它作为redirect_url时,我得到 ** uID = parsed_query [self.CALLBACK_USER_ID] [0] KeyError:'x_a'**当我运行程序时。我应该登录到ugatest2并使用_that_ URL吗? –

+0

您需要使用在用户完成登录后重定向到的URL(例如,如果您的Web应用程序在'https:// app.some_domain.com/launch'上运行,那么''redirect_url'应该看起来像像'https://app.some_domain.com/launch?x_a = abcd&x_b = efgh')。如果您将其作为控制台应用运行,那么您可能需要启动一个短暂的http服务器来收集登录凭据(这将成为您的目标),或者让您的用户密钥对出现并进行硬编码或者将它们作为参数或环境变量提供。 –

+0

进口看起来也有一点关系;通常你会使用“import d2lvalence.auth as d2lauth”来使用绝对导入引用;并且,您不需要从模块中导入*可能最好只使用工厂方法来构建应用程序上下文以及应用程序和用户上下文的方法以继续。 –

1

一旦您的应用程序工作正常,你就可以访问使用r.json()而不是r.text JSON响应。

相关问题