Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pycurl致力于开发,但不致力于生产。为什么?_Python_Django_Curl_Pycurl - Fatal编程技术网

Python Pycurl致力于开发,但不致力于生产。为什么?

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()

以下函数连接到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

导致直接错误的原因是:

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”。您应该首先编写代码,而不使用它们中的任何一个。然后调试它。那就别提了。只有当您可以对异常执行有意义的操作时,才能捕获异常。在这种情况下,从内容中获取值或从格式不正确的内容中获取值时会出现一些错误。但我们不知道。然后尝试返回不存在的对象。这是没有意义的,这就是为什么你应该让异常继续传播的原因。别在这里听懂了,非常感谢。这就解决了问题。没有尝试,除非我追踪到了真正的问题。谢谢。删除尝试,除非我跟踪并修复了该问题。