mongoengine-RuntimeError:生成器引发StopIteration

时间:2018-07-18 09:42:42

标签: python mongodb mongoengine flask-mongoengine

我有flask-mongoengine应用程序,当我要遍历mongoengine queryset对象时遇到了seriuos问题。这是我的mongoengine对象的代码:

mongo_models:

class Candid(Document):
   candid_intent_id = StringField()
   id_list = ListField(StringField())
   custom_code = StringField()
   is_approved = BooleanField()

   def to_json(self, *args, **kwargs):
       return {'candid_intent_id': self.candid_intent_id,
               'id_list': self.id_list,
               'custom_code': self.custom_code,
               'is_approved': self.is_approved}

我想这样遍历它们:

候选列表:

custom_code = 'Bob'
query_set = Candid.objects(is_denied=False, custom_code=current_request.custom_code)
try:
    for candid in query_set:
        suggested_intent_list.append(candid.to_json())
        if not candid.is_approved:
            suggested_intent_count += 1
except StopIteration:
    return 'StopIteration error'

现在是问题所在:当使用本地mongo服务器运行我的代码(使用python 3.5.2)时,它工作正常(无论Candid集合是否为空),但是我将代码部署在了dockerized服务器上(使用python) 3.7.0)我收到以下运行时错误:

File "/controller.py", line 25, in <candid_list>
   for candid in query_set:
RuntimeError: generator raised StopIteration

顺便说一句,mongoengine版本与本地和docker服务器运行相同:mongoengine == 0.15.0。

请告诉我是否需要提供更多信息,我们将为您提供任何帮助。

3 个答案:

答案 0 :(得分:1)

问题是在python 3.5中不赞成在生成器中使用StopIteration,在python 3.6中提出警告,而现在在python 3.7中提出错误。听起来该软件包尚未针对python 3.7做好准备。

https://www.python.org/dev/peps/pep-0479/#transition-plan

答案 1 :(得分:1)

升级mongoengine解决了我的问题。需要修复此错误的地方,必须更新旧版本(或引起此问题的版本)。

pip install mongoengine --upgrade

答案 2 :(得分:0)

@FHTMitchell指出问题是我的本地计算机(3.5.2)和docker服务器(3.7.0)上的python版本之间存在差异。我将docker映像的python更改为python:3.5-slim,它解决了问题。希望它能帮助某人。 但最重要的是,我从中得到的教训是: 确保您的开发和部署环境匹配!