BadRequestError: приложение dev~myapp не может получить доступ к данным приложения s~myapp

У меня ошибка:

BadRequestError: приложение "dev~myapp" не может получить доступ к данным приложения "s~myapp"

Что похоже, но противоположный ответ на этот вопрос.

Однако ответ, похоже, не относится к моему приложению (даже пытаясь перевернуть его с ног на голову) - у меня есть только одно приложение, и я не использую удаленный API, и я не использую ключи urlsafe, и все мои ключи свойства db.ReferencePropertys или db.ListProperty( db.Key )s.

Ошибка возникает в первой строке шаблона, который я пытаюсь отобразить:

Файл "/.../template.html", строка 1, код шаблона верхнего уровня {% extends "page.html" %}

Если я закомментирую эту строку, произойдет ошибка:

Файл "/.../template.html", строка 1, код шаблона верхнего уровня <!--{% extends "page.html" %}-->

Это подсказало мне, что ошибка заключается в фактической загрузке шаблона с помощью Jinja до применения магии шаблона.

template.html визуализируется с переменными, которые являются списками сущностей (не Query объектов, а [e for e in queryObject]s). Если я заменю их пустым списком, страница будет отображаться нормально.

Хранилище данных моего сервера разработки заполнено резервной копией с рабочего сервера, но до сих пор у меня не было проблем с доступом к этим записям. Я получаю эти списки объектов следующим образом:

@staticmethod
def gql(query, *a, **kw):
    keys    = super(Model, Model).gql(query, *a, **kw).run(keys_only=True)
    cached  = []

    for key in keys:
        inCache = memcache.get('Model_'+str(key))
        if inCache:
            cached.append(inCache)
        else:
            fromDB = Model.get(key)
            memcache.set('Model_'+str(key), fromDB)
            cached.append( fromDB )

    return cached

Я могу распечатать результаты с помощью logging до рендеринга с помощью Jinja. В интерактивной консоли тоже все нормально.

Почему это становится попыткой доступа к данным другого приложения и вызывает это исключение, когда Jinja его отображает?


person OJFord    schedule 18.09.2014    source источник


Ответы (2)


Я нашел причину - db.ListProperty( db.Key )s имеют вид:

[datastore_types.Key.from_path(u'ModelName', IDnumL, _app=u's~myapp')]

Это импортировано на сервер разработки из резервной копии производственного сервера с помощью этой удобной функции в gist.

К сожалению, как я ворчал ранее, сервер разработки не позволяет редактировать db.ListPropertys (и пару других типов).

Мое решение состояло в том, чтобы выполнить в интерактивной консоли следующее:

from google.appengine.ext.db import Key

for e in Model.all():
    if e.keyList:
        prod = e.keyList
        dev  = eval( str(prod).replace('s~','dev~').replace('datastore_types.','') )
        e.keyList = dev
        e.put()
person OJFord    schedule 19.09.2014

Это произошло со мной после перезагрузки моего компьютера. Сервер приложений выдал ту же ошибку, поскольку ему не удалось подключиться к файлу local_db.bin моего эмулятора хранилища данных. Эмулятор хранилища данных при запуске также возвращает

СЕРЬЕЗНЫЙ: не удалось найти резервное хранилище, /path/.config/gcloud/emulators/datastore/WEB-INF/appengine-generated/local_db.bin

Поэтому я переименовал local_db.bin и перезапустил эмулятор и dev_appserver.

Внимание: удаляются все ваши предыдущие данные

В моем случае у меня был файл сеялки, и я просто перезапустил его.

person Rad Apdal    schedule 22.05.2017