【问题标题】:BadRequestError: app "dev~myapp" cannot access app "s~myapp"'s dataBadRequestError:应用程序“dev~myapp”无法访问应用程序“s~myapp”的数据
【发布时间】:2014-11-13 09:59:08
【问题描述】:

我有错误:

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

类似,但the opposite way around to this question

虽然答案似乎不适用于我的应用程序(甚至试图将其完全颠覆)——我只有一个应用程序,而且我没有使用远程 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

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

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

【问题讨论】:

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


    【解决方案1】:

    我找到了原因 - db.ListProperty( db.Key )s 有以下形式:

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

    这是使用this neat function on 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()
    

    【讨论】:

      【解决方案2】:

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

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

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

      警告:删除您之前的所有数据

      在我的例子中,我有一个种子文件,然后重新运行它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-31
        • 2017-02-02
        • 2013-08-18
        • 2013-07-04
        相关资源
        最近更新 更多