【问题标题】:Getting "Expected string, got None" error on Model.get_by_id()在 Model.get_by_id() 上出现“预期的字符串,没有”错误
【发布时间】:2016-06-27 09:42:11
【问题描述】:

运行此代码时,使用 相同的 site_id

int_id= int(self.request.get("site_id"))
site_draft = SiteDraft.get_by_id(int_id)

我收到此错误:

INFO     2016-06-27 12:39:19,040 module.py:788] minisites: "GET /edit/5891733057437696 HTTP/1.1" 500 -
    return self.handle_exception(e, self.app.debug)
  File "C:\Program Files\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\lib\webapp2-2.3\webapp2.py", line 545, in dispatch
    return method(*args, **kwargs)
  File "C:\Users\Yuri\Documents\WiseStamp\Server\minisites\web\pages\edit_site.py", line 21, in get
    self.post(args)
  File "C:\Users\Yuri\Documents\WiseStamp\Server\minisites\web\pages\edit_site.py", line 44, in post
    site_draft = SiteDraft.get_by_id(int_id)
  File "C:\Program Files\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\ext\ndb\utils.py", line 160, in positional_wrapper
    return wrapped(*args, **kwds)
  File "C:\Program Files\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\ext\ndb\model.py", line 3602, in _get_by_id
    return cls._get_by_id_async(id, parent=parent, **ctx_options).get_result()
  File "C:\Program Files\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\ext\ndb\tasklets.py", line 378, in get_result
    self.check_success()
  File "C:\Program Files\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\ext\ndb\tasklets.py", line 425, in _help_tasklet_along
    value = gen.send(val)
  File "C:\Program Files\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\ext\ndb\context.py", line 765, in get
    pbs = entity._to_pb(set_key=False).SerializePartialToString()
  File "C:\Program Files\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\ext\ndb\model.py", line 3167, in _to_pb
    prop._serialize(self, pb, projection=self._projection)
  File "C:\Program Files\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\ext\ndb\model.py", line 1422, in _serialize
    values = self._get_base_value_unwrapped_as_list(entity)
  File "C:\Program Files\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\ext\ndb\model.py", line 1192, in _get_base_value_unwrapped_as_list
    wrapped = self._get_base_value(entity)
  File "C:\Program Files\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\ext\ndb\model.py", line 1180, in _get_base_value
    return self._apply_to_values(entity, self._opt_call_to_base_type)
  File "C:\Program Files\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\ext\ndb\model.py", line 1352, in _apply_to_values
    value[:] = map(function, value)
  File "C:\Program Files\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\ext\ndb\model.py", line 1234, in _opt_call_to_base_type
    value = _BaseValue(self._call_to_base_type(value))
  File "C:\Program Files\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\ext\ndb\model.py", line 1255, in _call_to_base_type
    return call(value)
  File "C:\Program Files\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\ext\ndb\model.py", line 1331, in call
    newvalue = method(self, value)
  File "C:\Program Files\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\ext\ndb\model.py", line 1781, in _validate
    (value,))
BadValueError: Expected string, got None

它曾经在一天前工作,但现在只有 20% 的时间工作(这也很奇怪 - 它似乎在某些时候工作)。更奇怪的是我提供了一个int 作为site_id,但它告诉我它得到了一个None

请指教。

【问题讨论】:

  • 似乎 site_id 没有在请求对象中定义。我建议您首先在请求中记录 site_id。
  • 嗨@TimHoffman,site_id 确实已定义,否则会破坏int 转换。谢谢。
  • 只需在您的 2 个语句之间打印 site_id 的值(和类型) - get_by_id() 的灵活性(接受字符串、整数和长整数)可以在它喷出的错误消息中发挥作用out (对于格式不正确的请求,例如,意外与否)。就我个人而言,在将请求值输入我的数据库之前,我会添加(很多)更多检查...
  • 只需重新检查您的堆栈跟踪我认为问题不在于您的身份。请显示 SiteDraft 的模型,并且您最近是否添加/更改了 SiteDraft 模型中定义的属性类型。我敢打赌,一些预先存在的实体不符合当前模型。请注意,在从数据存储区检索到某些内容后,错误出现在 _to_pb 中。
  • @TimHoffman 这正是问题所在。如果您将其发布为答案,我会接受。谢谢

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


【解决方案1】:

根据要求

详细查看堆栈跟踪并注意执行的操作,

我们看到了

 _get_by_id
 get_result
 _help_tasklet_al
 get
 _to_pb
 _serialize
 _get_base_value
_get_base_value
_apply_to_values
_opt_call_to_base
_call_to_base_type
call
_validate


BadValueError: Expected string, got None

我们看到执行路径在_get_by_id 内部,它正在处理get_result。因此已检索到一个实体。再往下看,我们看到代码实际上正在验证检索到的值,并在 _validate 调用中失败,并出现 BadValueError: Expected string, got None

如何在现有实体中获得不良价值。通常是由于更改了您所在的模型

  • 添加了新的必需属性,但不更新现有实体。,
  • 更改了现有属性的类型
  • 向属性添加了验证器,但未使现有实体符合要求。

当您更改模型时,考虑实体迁移很重要。

干杯

T

【讨论】:

  • 精湛的调试,蒂姆
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多