【发布时间】:2012-09-10 07:43:19
【问题描述】:
以下函数连接到 API 并返回一个 json 对象。虽然它只适用于开发。在生产服务器中它只返回 False。
任何想法为什么它不能在不同的服务器上工作?
def request_api(api_call, post_fields, authentication_data = None):
try:
log.debug("Connecting To API: " + settings.API_URL + api_call)
curl = pycurl.Curl()
curl.setopt(pycurl.URL, settings.API_URL + api_call)
except:
log.debug("Can't connect To API: " + settings.API_URL + api_call)
if post_fields:
try:
log.debug("Post Fields: " + post_fields)
curl.setopt(curl.POSTFIELDS, str(post_fields))
except:
log.debug("Error setting post fields.")
if authentication_data:
try:
log.debug("Authentication Fields: " + authentication_data)
curl.setopt(pycurl.USERPWD, authentication_data)
except:
log.debug("Error during authentication.")
try:
contents = StringIO.StringIO()
curl.setopt(pycurl.WRITEFUNCTION, contents.write)
curl.perform()
except:
log.debug("Error on curl.")
try:
responseCode = curl.getinfo(pycurl.HTTP_CODE);
log.debug("Response Code: " + str(responseCode))
except:
log.debug("Response Code: Error")
try:
log.debug("Response: " + contents.getvalue())
except:
log.debug("Response: Error")
try:
pyobj = json.loads(contents.getvalue())
log.debug("Response In Json Format: " + str(pyobj))
except:
log.debug("Response In Json Format: Error")
return pyobj
错误:
Exception Type: UnboundLocalError
Exception Value:
local variable 'pyobj' referenced before assignment
日志文件:
[18/Sep/2012 04:07:52] DEBUG [contests.views:29] Connecting To API: https://my-api/v1/token
[18/Sep/2012 04:07:52] DEBUG [contests.views:39] Authentication Fields: test@user.com:test@user.com
[18/Sep/2012 04:49:32] DEBUG [contests.views:51] Error on curl.
[18/Sep/2012 04:49:32] DEBUG [contests.views:54] Response Code: 0
[18/Sep/2012 04:49:32] DEBUG [contests.views:58] Response:
[18/Sep/2012 04:49:32] DEBUG [contests.views:65] Response In Json Format: Error
【问题讨论】:
-
您的代码充满了包罗万象的异常处理程序,这不是推荐的做法。对于任何未捕获的异常,整个事情都会返回 False。您应该删除它们,或者捕获更具体的内容。这可能隐藏了真正的错误。
-
感谢您的建议。它使错误更清楚。我相应地更新了问题和消息。任何想法为什么它可以在我的本地服务器上运行,但不能在其他服务器上运行?
-
捕获所有异常和日志记录的模式不是“Pythonic”。您应该首先编写没有任何代码的代码。然后调试它。然后把它们放在外面。只有当你可以用它做一些有意义的事情时才捕获异常。在这种情况下,从内容中获取值或格式错误的内容都会出现一些错误。但我们不能说。然后你尝试返回不存在的对象。这没有意义,这就是为什么你应该让异常传播。不要在这里抓住它。
-
非常感谢。这解决了这个问题。没有尝试,除非我跟踪了真正的问题。