2014-10-04 6 views
1

Как кэшировать вызовы API Mashape. Я получил код ниже, но он, похоже, не делает кеширование. Mashape использует unirest для получения ответа API.Кэширование вызовов API Mashape в Python

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 

Я был в состоянии сделать это с URL, где я могу добавить ключ API с помощью запроса HTTP библиотеку http://docs.python-requests.org/en/latest/index.html например

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 

Я использую django 1.6.6. Кэш хранится в базе данных. Мой файл settings.py. Имя базы данных - 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 
      } 


} 
} 
+1

Привет cloudviz, надеюсь, что я могу вам помочь, но, пожалуйста, вы можете, дайте мне знать немного больше ниже: * Вы установили библиотеку Unirest? Я не вижу его в вашем коде * Кэширование означает, что вы хотите сохранить ответ API в переменную? Имейте в виду, что если вы запустите сценарий два раза, переменная перестанет существовать после запуска первого скрипта, может быть, вам лучше записать ее на БД или статический файл на вашем диске где-нибудь в целях кеширования? –

+0

Спасибо. Я обновил свой вопрос @API_sheriff_orlie. Я установил библиотеку Unirest. Кэширование. Я хочу сохранить содержимое ответа (например, JSON) в базу данных с именем dev_cache. Все работает нормально, это кэширование ответа api mashape, которое работает неправильно. – cloudviz

+0

Вы пытались определить переменную «response» вне области if? –

ответ

1

Это мой рабочий раствор (не стесняйтесь, чтобы улучшить этот код)

Пример использования

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