Python Pycurl致力于开发,但不致力于生产。为什么?
以下函数连接到API并返回json对象。尽管它只对发展起作用。在生产服务器中,它只返回False 你知道为什么它不能在不同的服务器上工作吗Python Pycurl致力于开发,但不致力于生产。为什么?,python,django,curl,pycurl,Python,Django,Curl,Pycurl,以下函数连接到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()
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
导致直接错误的原因是:
try:
pyobj = json.loads(contents.getvalue())
log.debug("Response In Json Format: " + str(pyobj))
except:
log.debug("Response In Json Format: Error")
return pyobj
正如您在日志中看到的,try
子句失败,这意味着没有定义pyobj
。当您尝试在函数末尾返回它时,它不存在,因此您会得到一个UnboundLocalError
此部分失败的原因可能与
contents.getValue
崩溃或将不合适的内容传递给json.loads
有关。但是,由于您正在捕获所有异常并返回自己的不太有用的错误消息,因此您隐藏了所有相关的回溯信息,这些信息将帮助您了解问题的真正所在。回溯将准确地告诉您错误是什么以及它发生在哪里,一直到代码的文件和行,这将比Json格式的响应更有用:error
您的代码中充满了捕获所有异常处理程序,这不是推荐的做法。如果出现任何未捕获的异常,整个事件都将返回False。你应该移除它们,或者捕捉更具体的东西。这可能隐藏了真正的错误。谢谢你的建议。这使错误更加清楚。我相应地更新了问题和消息。你知道为什么它可以在我的本地服务器上工作,但不能在另一个服务器上工作吗?这种捕获所有异常和日志的模式并不是“Pythonic”。您应该首先编写代码,而不使用它们中的任何一个。然后调试它。那就别提了。只有当您可以对异常执行有意义的操作时,才能捕获异常。在这种情况下,从内容中获取值或从格式不正确的内容中获取值时会出现一些错误。但我们不知道。然后尝试返回不存在的对象。这是没有意义的,这就是为什么你应该让异常继续传播的原因。别在这里听懂了,非常感谢。这就解决了问题。没有尝试,除非我追踪到了真正的问题。谢谢。删除尝试,除非我跟踪并修复了该问题。