从HTML表单发布密钥时BadKeyError

时间:2011-02-03 16:14:40

标签: python google-app-engine google-cloud-datastore

我正在尝试在我的应用中创建一个功能,用户可以将当前位置与其帐户相关联。用户可以添加多个位置,添加位置时,会将其添加为该用户的子级。为了允许用户设置他们的当前位置,我创建了一个表单,在表单中他们指定要将其设置为当前位置的位置。这个模板如下:

<form action="setlocation" method="post">
<table id="locationform" class="fitted">
    <tr>
        <td colspan="3"><b>Location settings</b></td>
    </tr>
    <tr>
        <td class="label">Current location</td>
        <td class="input">
            <select name="lockey">
                {% for i in locinfo %}
                    <option value="{{i.key}}">{{i.locname}}</option>
                {% endfor %}
            </select>
        </td>
        <td><input type="submit" value="Set Location"></td>
    </tr>
    <tr>
        <td colspan="3"><a href="/addlocation">Add new location</a></td>
    </tr>
</table>
</form>

因此,每个选择的值是该位置的关键。表单发布到/ setlocation,其处理方式如下:

class SetLocation(BaseHandler):
    def post_secure(self):
        userdata = db.GqlQuery("SELECT * FROM User WHERE fbid = :1", self.user['uid'])[0]
        userdata.currentloc = self.request.get('lockey')
        logging.warn("Current location saved")
        userdata.put()
        self.redirect('/account')

...但是当我进入数据存储区时,没有与currentloc相关的值。在/ account的处理程序中,我放了一行来记录用户currentloc的密钥,并在日志中收到错误,说“BadKeyError:不能对不完整的密钥进行字符串编码!”。我不知道密钥在哪里被改变了,所以我猜这与字符串(对于页面)和db.Key()类型之间的转换有关。

修改

这是错误的完整堆栈跟踪:

  

追踪(最近一次通话):     文件“/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/logging/init.py”,第744行,发出       msg = self.format(记录)     文件“/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/logging/init.py”,第630行,格式       return fmt.format(record)     文件“/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/logging/init.py”,第418行,格式       record.message = record.getMessage()     getMessage中的文件“/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/logging/init.py”,第288行       msg = msg%self.args     在 str 中输入文件“/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/datastore_types.py”,第595行       '不能对不完整的密钥进行字符串编码!\ n%s'%self .__参考)   BadKeyError:无法对不完整的密钥进行字符串编码!

2 个答案:

答案 0 :(得分:0)

您需要包含完整的堆栈跟踪及其包含的代码以确定,但听起来您在生成表单时会收到异常,而不是在提交表单时。

如果您从对象获取.key()并尝试在其上调用str(),未指定密钥名称且尚未存储,则会出现您引用的异常数据存储区的实体。在尝试对密钥进行字符串化之前,请先调用实体.put()

答案 1 :(得分:0)

解决了它。问题是我将对当前位置的引用存储为db.Key类型而不是db.ReferenceProperty。