Search code examples
pythondjangocachingmashape

Caching Mashape API calls in Python


How can I cache Mashape API calls. I got the code below but it does not seem to be doing the caching. Mashape is using unirest to get the API response.

def fetchMashape(url, headers):
    cached = unirest.get(url, headers=headers) #cache.get(url)
    content =""
    if not cached:
        response = unirest.get(url,
                    headers=headers)
    else:
        response = cached
    dictionary = json.loads(response.raw_body)

    return dictionary

I was able to do it with a URL where I can append the API key using the request http library http://docs.python-requests.org/en/latest/index.html e.g.

from django.core.cache import cache
from urllib2 import Request, urlopen, build_opener
from urllib import urlencode
import json, ast
import unirest
import requests
import xmltodict

test = fetchJson("http//www.myapi.com/v1/MY_API_KEY/query/json=blahblah")

#fetchJson with caching
def fetchJson(url):
    cached = cache.get(url)
    content = ""
    if not cached:
        r = requests.get(url)
        if(r.ok):
            cache.set(url, r.text)
            content = r.text
        else:
            content = None  
    else:
        # Return the cached content
        content = cached
    if content is not None:
        return json.loads(content)
    else:
        return None

I am using django 1.6.6. Cache are stored in a database. My settings.py file. The name of the database is dev_cache.

  CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
            'LOCATION': 'dev_cache',
            'TIMEOUT': 60*60*24*7*4,
            'VERSION': 1,
            'OPTIONS': {
                'MAX_ENTRIES': 1022000
            }


 }
}

Solution

  • This is my working solution (feel free to improve this code)

    Example usage

    url = "https://something_api.p.mashape.com/q=whateverquery",
    headers={"X-Mashape-Key": "ABCDEFG12345"}
    test = fetchMashape(url, headers)
    
    def fetchMashape(url, headers):
        cached = cache.get(url)
        content = ""
        if not cached:
            response = unirest.get(url,
                  headers=headers)
            print "not cached"
            if response is not None:
                cache.set(url, response.raw_body)
                content = response.raw_body
            else:
                content = None
        else:
            content = cached
            print "already cached"
    
        dictionary = json.loads(content)
    
        return dictionary