为什么我的 Flask 应用程序部署到 Heroku 在 sqlite3.OperationalError 上失败,而我的应用程序甚至不使用数据库?
Why is my Flask app deploy to Heroku failing on a sqlite3.OperationalError when my app doens't even use a database?
我正在使用 Flask 构建一个基本的 Web 应用程序。输入标签和你的电子邮件,点击提交,Celery 工作人员(配置为使用 Redis)从 Flickr 抓取图像,下载它们,压缩它们,并将 zip 文件作为附件发送到提供的电子邮件。
我没有将我的应用程序配置为使用任何数据库,我想我不需要一个。然而,当我尝试将我的应用程序部署到 Heroku 时,我从错误日志中得到以下信息:
2017-03-03T18:33:49.500689+00:00 app[web.1]: Traceback (most recent call last):
2017-03-03T18:33:49.500691+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/arbiter.py", line 557, in spawn_worker
2017-03-03T18:33:49.500692+00:00 app[web.1]: worker.init_process()
2017-03-03T18:33:49.500692+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/workers/base.py", line 126, in init_process
2017-03-03T18:33:49.500693+00:00 app[web.1]: self.load_wsgi()
2017-03-03T18:33:49.500694+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/workers/base.py", line 136, in load_wsgi
2017-03-03T18:33:49.500694+00:00 app[web.1]: self.wsgi = self.app.wsgi()
2017-03-03T18:33:49.500695+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/app/base.py", line 67, in wsgi
2017-03-03T18:33:49.500696+00:00 app[web.1]: self.callable = self.load()
2017-03-03T18:33:49.500697+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 65, in load
2017-03-03T18:33:49.500697+00:00 app[web.1]: return self.load_wsgiapp()
2017-03-03T18:33:49.500698+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp
2017-03-03T18:33:49.500699+00:00 app[web.1]: return util.import_app(self.app_uri)
2017-03-03T18:33:49.500699+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/util.py", line 357, in import_app
2017-03-03T18:33:49.500700+00:00 app[web.1]: __import__(module)
2017-03-03T18:33:49.500700+00:00 app[web.1]: File "/app/app.py", line 31, in <module>
2017-03-03T18:33:49.500701+00:00 app[web.1]: flickr = flickrapi.FlickrAPI(flickr_key, flickr_secret, format='parsed-json')
2017-03-03T18:33:49.500702+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/flickrapi/core.py", line 209, in __init__
2017-03-03T18:33:49.500702+00:00 app[web.1]: self.flickr_oauth = auth.OAuthFlickrInterface(api_key, secret, self.token_cache)
2017-03-03T18:33:49.500703+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/flickrapi/auth.py", line 166, in __init__
2017-03-03T18:33:49.500704+00:00 app[web.1]: if oauth_token.token:
2017-03-03T18:33:49.500704+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/flickrapi/tokencache.py", line 180, in token
2017-03-03T18:33:49.500705+00:00 app[web.1]: (self.api_key, self.lookup_key))
2017-03-03T18:33:49.500709+00:00 app[web.1]: sqlite3.OperationalError: no such table: oauth_tokens
Flask 应用程序在部署到 Heroku 之前是否需要配置数据库?这似乎很荒谬。
这似乎是 FlickrAPI 的问题。错误看起来是在 FlickrAPI 使用我的 api_key 和 secret 对我进行身份验证时抛出的,但当我在本地测试时它从未抛出该错误,我不明白为什么 API 访问将需要一个数据库来跟踪令牌缓存和 oauth_tokens 无论如何。
我需要使用不同的 FlickrAPI 模块吗?我需要在我的应用程序中使用数据库吗?我是 Python 和 Flask 的新手,所以我可能缺少一些基本的东西。
如有任何帮助,我们将不胜感激!
我的requirements.txt:
Flask==0.10.1
Flask-Mail==0.9.1
Jinja2==2.7.3
MarkupSafe==0.23
Werkzeug==0.9.6
amqp==1.4.6
anyjson==0.3.3
argparse==1.2.1
billiard==3.3.0.19
blinker==1.3
celery==3.1.17
click==6.7
flickrapi==2.2.1
gunicorn==19.6.0
itsdangerous==0.24
kombu==3.0.30
oauthlib==2.0.1
pytz==2014.10
ratelimit==1.2.0
redis==2.10.3
requests==2.13.0
requests-oauthlib==0.8.0
requests-toolbelt==0.7.1
six==1.10.0
vine==1.1.3
FlickrAPI 包将 SQLite 用于其 OAuthTokenCache(参见代码 here). And it seems that SQLite is not supported by Heroku (filesystem is ephemeral in Heroku): https://devcenter.heroku.com/articles/sqlite3
所以你可能想看看 alternatives in PyPi。
我正在使用 Flask 构建一个基本的 Web 应用程序。输入标签和你的电子邮件,点击提交,Celery 工作人员(配置为使用 Redis)从 Flickr 抓取图像,下载它们,压缩它们,并将 zip 文件作为附件发送到提供的电子邮件。
我没有将我的应用程序配置为使用任何数据库,我想我不需要一个。然而,当我尝试将我的应用程序部署到 Heroku 时,我从错误日志中得到以下信息:
2017-03-03T18:33:49.500689+00:00 app[web.1]: Traceback (most recent call last):
2017-03-03T18:33:49.500691+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/arbiter.py", line 557, in spawn_worker
2017-03-03T18:33:49.500692+00:00 app[web.1]: worker.init_process()
2017-03-03T18:33:49.500692+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/workers/base.py", line 126, in init_process
2017-03-03T18:33:49.500693+00:00 app[web.1]: self.load_wsgi()
2017-03-03T18:33:49.500694+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/workers/base.py", line 136, in load_wsgi
2017-03-03T18:33:49.500694+00:00 app[web.1]: self.wsgi = self.app.wsgi()
2017-03-03T18:33:49.500695+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/app/base.py", line 67, in wsgi
2017-03-03T18:33:49.500696+00:00 app[web.1]: self.callable = self.load()
2017-03-03T18:33:49.500697+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 65, in load
2017-03-03T18:33:49.500697+00:00 app[web.1]: return self.load_wsgiapp()
2017-03-03T18:33:49.500698+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp
2017-03-03T18:33:49.500699+00:00 app[web.1]: return util.import_app(self.app_uri)
2017-03-03T18:33:49.500699+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/util.py", line 357, in import_app
2017-03-03T18:33:49.500700+00:00 app[web.1]: __import__(module)
2017-03-03T18:33:49.500700+00:00 app[web.1]: File "/app/app.py", line 31, in <module>
2017-03-03T18:33:49.500701+00:00 app[web.1]: flickr = flickrapi.FlickrAPI(flickr_key, flickr_secret, format='parsed-json')
2017-03-03T18:33:49.500702+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/flickrapi/core.py", line 209, in __init__
2017-03-03T18:33:49.500702+00:00 app[web.1]: self.flickr_oauth = auth.OAuthFlickrInterface(api_key, secret, self.token_cache)
2017-03-03T18:33:49.500703+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/flickrapi/auth.py", line 166, in __init__
2017-03-03T18:33:49.500704+00:00 app[web.1]: if oauth_token.token:
2017-03-03T18:33:49.500704+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/flickrapi/tokencache.py", line 180, in token
2017-03-03T18:33:49.500705+00:00 app[web.1]: (self.api_key, self.lookup_key))
2017-03-03T18:33:49.500709+00:00 app[web.1]: sqlite3.OperationalError: no such table: oauth_tokens
Flask 应用程序在部署到 Heroku 之前是否需要配置数据库?这似乎很荒谬。
这似乎是 FlickrAPI 的问题。错误看起来是在 FlickrAPI 使用我的 api_key 和 secret 对我进行身份验证时抛出的,但当我在本地测试时它从未抛出该错误,我不明白为什么 API 访问将需要一个数据库来跟踪令牌缓存和 oauth_tokens 无论如何。
我需要使用不同的 FlickrAPI 模块吗?我需要在我的应用程序中使用数据库吗?我是 Python 和 Flask 的新手,所以我可能缺少一些基本的东西。
如有任何帮助,我们将不胜感激!
我的requirements.txt:
Flask==0.10.1
Flask-Mail==0.9.1
Jinja2==2.7.3
MarkupSafe==0.23
Werkzeug==0.9.6
amqp==1.4.6
anyjson==0.3.3
argparse==1.2.1
billiard==3.3.0.19
blinker==1.3
celery==3.1.17
click==6.7
flickrapi==2.2.1
gunicorn==19.6.0
itsdangerous==0.24
kombu==3.0.30
oauthlib==2.0.1
pytz==2014.10
ratelimit==1.2.0
redis==2.10.3
requests==2.13.0
requests-oauthlib==0.8.0
requests-toolbelt==0.7.1
six==1.10.0
vine==1.1.3
FlickrAPI 包将 SQLite 用于其 OAuthTokenCache(参见代码 here). And it seems that SQLite is not supported by Heroku (filesystem is ephemeral in Heroku): https://devcenter.heroku.com/articles/sqlite3
所以你可能想看看 alternatives in PyPi。