我是python和flask的新手。我正试图通过http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world的烧瓶教程。我遇到了一个我无法弄清楚的错误。我已经详尽地(我认为)搜索了一个解决方案,但我找不到适合我的问题的解决方案。我已经卸载并重新安装了烧瓶。我甚至创造了一个新的venv并重新开始,但没有任何效果。
我正在尝试构建一个简单的Web表单应用程序。我创建了一个表单:
from flask_wtf import Form
from wtforms import StringField, BooleanField
from wtforms.validators import DataRequired
class LoginForm(Form):
openid = StringField('openid', validators=[DataRequired()])
remember_me = BooleanField('remember_me', default=False)
当我导入LoginForm时,我收到错误
TypeError: an integer is required (got type str)
完整的堆栈跟踪在这里:
C:\microblog\flask\Scripts\python.exe C:/microblog/run.py
Traceback (most recent call last):
File "C:/microblog/run.py", line 2, in <module>
from app import app
File "C:\microblog\app\__init__.py", line 6, in <module>
from app import views
File "C:\microblog\app\views.py", line 5, in <module>
from .forms import LoginForm
File "C:\microblog\app\forms.py", line 3, in <module>
from flask_wtf import Form
File "C:\microblog\flask\lib\site-packages\flask_wtf\__init__.py", line 15, in <module>
from .form import Form
File "C:\microblog\flask\lib\site-packages\flask_wtf\form.py", line 15, in <module>
from .i18n import translations
File "C:\microblog\flask\lib\site-packages\flask_wtf\i18n.py", line 12, in <module>
from flask_babel import get_locale
File "C:\microblog\flask\lib\site-packages\flask_babel\__init__.py", line 21, in <module>
from babel import dates, numbers, support, Locale
File "C:\microblog\flask\lib\site-packages\babel\dates.py", line 28, in <module>
from babel.util import UTC, LOCALTZ
File "C:\microblog\flask\lib\site-packages\babel\util.py", line 278, in <module>
from babel import localtime
File "C:\microblog\flask\lib\site-packages\babel\localtime\__init__.py", line 21, in <module>
from babel.localtime._win32 import _get_localzone
File "C:\microblog\flask\lib\site-packages\babel\localtime\_win32.py", line 18, in <module>
tz_names = get_global('windows_zone_mapping')
File "C:\microblog\flask\lib\site-packages\babel\core.py", line 58, in get_global
_global_data = pickle.load(fileobj)
TypeError: an integer is required (got type str)
感谢任何帮助 - 这让我疯了!
答案 0 :(得分:5)
这是python包索引
上的babel 2.0包中的构建错误https://github.com/mitsuhiko/babel/issues/174
总而言之,包中包含一个pickle文件babel/global.dat
,python 3无法读取它,因为它是由在python 2下运行的脚本创建的。
我通过在github问题中建议从github而不是PyPI安装来解决这个问题:
pip install git+https://github.com/mitsuhiko/babel.git@2.0
答案 1 :(得分:1)
我在Windows上使用Python 3.4,我得到了同样的错误。
我为解决问题所做的是卸载烧瓶babel模块,如下所示:
flask\Scripts\pip uninstall flask-babel
之后仍然正确导入babel模块:
import babel
唯一的问题是我不明白这背后的理由。
答案 2 :(得分:0)
在与您完全相同的时间得到完全相同的问题 - 我很高兴看到它上面的stackoverflow页面只是看到它没有答案。我似乎找到了解决办法,但我要注意的事实是我不是专家,明天可能会发现这打破了别的东西。
根据core.py的依赖关系,我发现根据您运行的python版本,/ babel / _compat.py会导入cPickle或pickle,这是什么core.py正在导入为pickle。
我在/babel/_compat.py中更改了第22行
import cPickle as pickle
到
import pickle
并且看到一切都在工作。
同样,这可能已经打破了很多我不知道的事情,但是从我所读到的内容来看,似乎cPickle更快,所以这只会牺牲速度而不应该改变功能。如果你只是按照烧瓶教程,我怀疑这是一个问题。
答案 3 :(得分:0)
我的/babel/_compat.py版本已经有import pickle
,所以我决定尝试卸载并重新安装flask-babel。在我卸载它之后,我只是出于好奇而运行了我的应用程序 - 它运行了!我希望我明白为什么,但我现在已经畅通无阻。