The following function connects to an API and returns a json object. Although it only works on development. In the production server it just returns False.
Any ideas why it doesn’t work in a different server?
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
Error:
Exception Type: UnboundLocalError
Exception Value:
local variable 'pyobj' referenced before assignment
Log File:
[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
What’s causing the immediate error is this:
The
tryclause is failing, as you can see in your log, which meanspyobjisn’t being defined. When you try toreturnit at the end of the function, it doesn’t exist, so you get anUnboundLocalError.Why this section is failing will have to do with either
contents.getValuecrashing or passing something inappropriate tojson.loads. However, because you are catching all exceptions and returning your own less than helpful error messages, you are hiding all of the relevant traceback information that would help you realise where the problem really lies. The traceback will tell you exactly what the error is and where it occurred down to the file & line of code, which will be of much more use to you thanResponse In Json Format: Error.