2

我有一个使用突然损坏的 sql-alchemy 包运行 mysql 数据库的网站。我做了一些研究,发现预期的问题是最新的 sql-alchemy 更新给 flask-admin 带来的价值比预期的多一个

"cls, key = identity_key(instance=obj)"




建议的修复是编辑文件以接受第三项,但我无法使用我对环境的权限执行此操作。

另一个答案链接到 github 上的 repo,但我不知道这对我有什么帮助。我对此很陌生,我不知道我是否应该克隆 repo,或者如果我是的话,我该怎么做。

任何帮助表示赞赏!

这是错误转储

2018-01-22 20:01:59,593:[2018-01-22 20:01:59,592] 应用程序中的错误:/reservation/add [GET]
2018-01-22 20:01:59,594 异常:回溯(大多数最近通话最后):
2018-01-22 20:01:59,594:
文件“fakepath/flask/app.py”,第 1982 行,在 wsgi_app 2018-01-22
20:01:59,594:响应 = self.full_dispatch_request() 2018-01-22 20:01:59,594:文件“fakepath/flask/app.py”,第 1614 行,在 full_dispatch_request 2018-01-22
20:01:59,594:rv = self.handle_user_exception(e)
2018-01- 22 20:01:59,595:文件“fakepath/flask/app.py”,第 1517 行,在 handle_user_exception2018-01-22 20:01:59,595:reraise(exc_type,exc_value,tb)2018-01-22 20:01: 59,595:文件“fakepath/flask/_compat.py”,第 33 行,在 reraise
2018-01-22 20:01:59,595:提高价值 2018-01-22 20:01:59,595:文件“fakepath/flask/app.py”,第 1612 行,在 full_dispatch_request 2018-01-22
20:01:59,595 中: rv = self.dispatch_request() 2018-01-22
20:01:59,596:文件“fakepath/flask/app.py”,第 1598 行,在 dispatch_request2018-01-22 20:01:59,596 中:返回 self.view_functionsrule.endpoint
2018-01-22 20:01:59,596:文件“fakepath/flask_login/utils.py”,第 261 行,在 decorated_view
2018-01-22 20:01:59,596:返回 func(*args,**kwargs)
2018- 01-22 20:01:59,597:文件“/home/apoalphagammawebmaster/inventory/app/auth/views.py”,第 248 行,在 add_reservation 2018-01-22
20:01:59,597:form=form,title='添加预订')
2018-01-22 20:01:59,597:文件“fakepath/flask/template.py”,第 134 行,在 render_template2018-01-22 20:01:59,597:上下文,ctx.app)2018-01-22
20: 01:59,597:文件“fakepath/flask/template.py”,第 116 行,在 _render 中 2018-01-22
20:01:59,597:rv = template.render(context)
2018-01-22 20:01:59,598:文件“fakepath/jinja2/asyncsupport.py”,第 76 行,渲染
2018-01-22 20:01:59,598:返回 original_render(self, *args, **kwargs)2018-01-22 20:01:59,598:文件“fakepath/jinja2/environment.py”,第 1008 行,在渲染
2018-01-22 20:01:59,598:返回 self.environment.handle_exception(exc_info,True)2018-01-22
20:01:59,598:文件“fakepath/jinja2/environment.py”,第 780 行,在 handle_exception 中
2018-01-22 20:01:59,599: reraise(exc_type, exc_value, tb) 2018-01-22
20:01:59,599: 文件“fakepath/jinja2/_compat.py”,第 37 行,在 reraise
2018-01- 22 20:01:59,599: raise value.with_traceback(tb) 2018-01-22
20:01:59,599: 文件“/home/apoalphagammawebmaster/inventory/app/templates/auth/reservations/reservation.html”,第 2 行,在顶级模板代码
2018-01-22 20:01:59,599:
{% extends "base.html" %}
2018-01-22 20:01:59,599: 文件 "/home/apoalphagammawebmaster/inventory/app/templates /base.html”,第 48 行,顶级模板代码
2018-01-22 20:01:59,600: {% block body %}
2018-01-22 20:01:59,600:文件“/home/apoalphagammawebmaster/inventory/app/templates/auth/reservations/reservation.html”,第 27 行,在块“body”中 2018-01-22 20:01
: 59,600:{{ wtf.quick_form(form) }} 2018-01-22
20:01:59,600:文件“fakepath/jinja2/runtime.py”,第 579 行,在 _invoke 2018-01-22
20:01:59,600 中: rv = self._func(*arguments) 2018-01-22
20:01:59,601:文件“fakepath/flask_bootstrap/templates/bootstrap/wtf.html”,第 205 行,模板
2018-01-22 20:01:59,601 :{{ form_field(字段,2018-01-22 20:01:59,601:文件“fakepath/jinja2/runtime.py”,第 579 行,在 _invoke 2018-01-22
20:01:59,601:rv = self._func (*参数)
2018-01-22 20:01:59,601:文件“fakepath/flask_bootstrap/templates/bootstrap/wtf.html”,第 123 行,模板
2018-01-22 20:01:59,601:
{{field(class="form -control", **kwargs)|safe}}
2018-01-22 20:01:59,601:文件“fakepath/wtforms/fields/core.py”,第 153 行, 调用
2018-01-22 20:01 : 59,601:返回 self.meta.render_field(self,kwargs)
2018-01-22 20:01:59,602:
文件“fakepath/wtforms/meta.py”,第 56 行,在 render_field2018-01-22 20:01:59,602 中: return field.widget(field, **render_kw) 2018-01-22
20:01:59,602:文件“fakepath/wtforms/widgets/core.py”,第 287 行,调用2018-01-22 20:01:59,602 :对于 val,标签,在 field.iter_choices() 中选择:
2018-01-22 20:01:59,602:文件“fakepath/wtforms/ext/sqlalchemy/fields.py”,第 107 行,在 iter_choices 2018-01-22
20:01:59,602:对于 pk,self._get_object_list 中的 obj ():
2018-01-22 20:01:59,602:文件“fakepath/wtforms/ext/sqlalchemy/fields.py”,第 100 行,在 _get_object_list 2018-01-22
20:01:59,602:self._object_list = list ((text_type(get_pk(obj)), obj) for obj in query)
2018-01-22 20:01:59,603:文件“fakepath/wtforms/ext/sqlalchemy/fields.py”,第 100 行,
2018-01 -22 20:01:59,603:self._object_list = list((text_type(get_pk(obj)), obj) for obj in query)
2018-01-22 20:01:59,603:文件“fakepath/wtforms/ext/sqlalchemy /fields.py”,第 189 行,在 get_pk_from_identity 中
2018-01-22 20:01:59,603: cls, key = identity_key(instance=obj)
2018-01-22 20:01:59,603: ValueError: 要解包的值太多(预期 2)

4

2 回答 2

8

github问题线程中涵盖了该问题 - https://github.com/flask-admin/flask-admin/issues/1588

基本上,flask-admin就最新的 pip 包而言,pip 包已经过时了sqlalchemy。在那个特定区域,

cls, key = identity_key(instance=obj)

sqlalchemy现在返回 3 个对象,但flask-admin只期望 2 个,因此出现错误。

真正的解决方案是等到新flask-admin版本上传到 pip,在那之前,你有几个选择。

  1. 手动进入并编辑该fields.py文件
  2. 如该问题线程中所述,仅限sqlalchemy于 version 1.2.0b3。您可以在您的 requirements.txt 文件中执行此操作,或者使用 pip upgrade install 手动执行此操作,pip install --upgrade sqlalchemy==1.2.0b3
  3. 由于修复程序flask-admin位于其 github 存储库中的 master 分支中,因此安装该版本flask-admin的 pip 位置为git+https://github.com/flask-admin/flask-admin. 同样,您可以在您的 requirements.txt 文件中执行此操作,或者使用 pip upgrade install 执行此操作pip install --upgrade git+https://github.com/flask-admin/flask-admin

我个人的偏好,以及我所做的,是选项 3。如果您查看代码本身,无论如何,这是维护人员想要删除的一行,并且他们如何处理它会更好,并且通常与这些事情,我更喜欢前进(最新版本flask-admin)而不是推迟(回滚sqlalchemy到以前的版本),当然比手动编辑原始代码更好。

于 2018-01-25T20:13:58.710 回答
0

我也有这个问题。我得到了黑客(如上所述)的工作,但查看https://github.com/wtforms/wtforms/issues/373https://github.com/flask-admin/flask-admin/上的讨论问题/1588,看起来对 wtforms_sqlalchemy 的支持不如 wtforms_alchemy。

所以,我安装了 wtforms_alchemy

pip install wtforms_alchemy 

并在我的项目中用 wtform_alchemy 替换了 wtforms_sqlalchemy

from wtforms_alchemy.fields import QuerySelectField 

我的项目也一样。

于 2018-08-16T00:13:50.417 回答