#python #flask #flask-caching
#python #flask #flask-кэширование
Вопрос:
Я создаю приложение и использую структуру чертежей. Мой код работает нормально, но я получил эту ошибку при попытке внедрить кэширование flask в одну функцию.
Возвращаемая ошибка: AttributeError: объект ‘Blueprint’ не имеет атрибута ‘cache’
Есть ли у кого-нибудь здесь решение, чтобы сделать кэш для этой функции?
Вот фрагмент моего кода:
from flask import render_template, redirect, request, Blueprint
from cache import store_weather, number_of_views, cached_weather, cache
import json, requests
bp = Blueprint('bp', __name__, url_prefix="/weather")
main = Blueprint('main', __name__)
api_key = "42fbb2fcc79717f7601238775a679328"
@main.route('/')
def hello():
views = 5
max_views = number_of_views()
return render_template('index.html', cached_weather=cached_weather, max_views=max_views, views=views)
@bp.route('/', methods=['GET'])
def weather():
clean_list_cache()
if request.args.get('max').isdigit():
views = int(request.args.get('max'))
else:
views = 5
try:
city_name = request.args.get('city')
if city_name not in cached_weather:
uri = 'http://api.openweathermap.org/data/2.5/weather?q={city}amp;appid={key}'.format(city=city_name,key=api_key)
# On that point, we bring the data from the Open Weather API
rUrl = requests.get(uri)
# The temperature of the Open Weather API is in Kelvin, so, we have to subtract 273.15 to transform
# it into Celsius degrees
temperature = str(round((json.loads(rUrl.content)['main'])['temp']-273.15)) " °C"
name = json.loads(rUrl.content)['name']
description = json.loads(rUrl.content)['weather'][0]['description']
city_data = { "temp":temperature, "name":name, "desc":description }
store_weather(city_data)
max_views = number_of_views(views)
return render_template('weather.html', cached_weather = cached_weather, error_rec_city = False, max_views=max_views, views=views)
except KeyError:
max_views = number_of_views(views)
return render_template('weather.html', cached_weather=cached_weather, error_rec_city = True, max_views=max_views, views=views)
@bp.cache.cached(timeout=30, key_prefix='list_cache')
def clean_list_cache():
cached_weather.clear()
Ответ №1:
Ошибка возникает, когда вы пытаетесь вызвать cache в своей схеме элементов: @bp.cache.cached
. Примером из документации по использованию кэша является:
@app.route("/")
@cache.cached(timeout=50)
def index():
return render_template('index.html')
Таким образом, вам нужно сжать декоратор кэша между вашим декоратором приложения и функцией
Комментарии:
1. Это означает, что я не могу использовать его внутри кэша внутри любого распечатанного маршрута? Или есть какой-нибудь способ пройти через это?
2. Вы также можете использовать его с blueprint, я просто использовал
@app
в качестве примера. Но@cache
это сам декоратор. Таким образом, вы можете использовать оба декоратора или только один из них, но вы не можете комбинировать их так, как@bp.cache
это просто не работает. Прочитайте документы Flask Cache, чтобы убедиться, что вы используете его правильно