【问题标题】:Pycurl works on development but not on production. Why?Pycurl 致力于开发而不是生产。为什么?
【发布时间】: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”。您应该首先编写没有任何代码的代码。然后调试它。然后把它们放在外面。只有当你可以用它做一些有意义的事情时才捕获异常。在这种情况下,从内容中获取值或格式错误的内容都会出现一些错误。但我们不能说。然后你尝试返回不存在的对象。这没有意义,这就是为什么你应该让异常传播。不要在这里抓住它。
  • 非常感谢。这解决了这个问题。没有尝试,除非我跟踪了真正的问题。

标签: python django curl pycurl


【解决方案1】:

导致立即错误的原因是:

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 没有被定义。当你在函数末尾尝试return它时,它不存在,所以你得到一个UnboundLocalError

为什么此部分失败将与 contents.getValue 崩溃或将不适当的内容传递给 json.loads 有关。但是,由于您正在捕获所有异常并返回您自己的不太有用的错误消息,您隐藏了所有有助于您了解问题真正所在的相关回溯信息。回溯会确切地告诉你错误是什么以及它发生在文件和代码行的位置,这对你来说比Response In Json Format: Error更有用。

【讨论】:

  • 谢谢。删除尝试,除非我跟踪并修复了问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-16
  • 2021-11-27
  • 1970-01-01
相关资源
最近更新 更多