BadRequestError:app“dev~myapp”无法访问app“s~myapp”的数据

时间:2014-09-18 22:08:14

标签: python google-app-engine jinja2 wsgi webapp2

我有错误:

  

BadRequestError:app“dev~myapp”无法访问app“s~myapp”的数据

哪个相似,但是the opposite way around to this question

答案似乎并不适用于我的应用程序(甚至尝试将其置于脑后) - 我只有一个应用程序,而且我没有使用远程API,而且我没有使用urlsafe密钥,并且我的所有关键属性都是db.ReferenceProperty s或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

在使用Jinja渲染之前,我可以使用logging打印结果。它在交互式控制台中也很好。

为什么这会成为访问其他应用程序数据的尝试,并在Jinja呈现时引发此异常?

2 个答案:

答案 0 :(得分:3)

我发现原因 - db.ListProperty( db.Key )的形式为:

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

这是从使用this neat function的生产服务器备份导入到dev服务器。

不幸的是,正如我之前抱怨的那样,开发服务器不允许编辑db.ListProperty(以及其他几种类型)。

我的解决方案是在交互式控制台中执行以下操作:

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()

答案 1 :(得分:0)

重新启动计算机后发生这种情况。 appserver产生了同样的错误,因为它无法连接到我的数据存储模拟器的local_db.bin。启动时的数据存储模拟器也会返回

  

严重:找不到后备存储,/ path / .config / gloud / emulators / datastore / WEB-INF / appengine-Generated / local_db.bin

所以我重命名了local_db.bin并重新运行了模拟器和dev_appserver。

警告:删除以前的所有数据

在我的情况下,我有一个播种器文件,然后重新运行它。