我正在开发一个用于图像编辑的 Flask 应用程序,直到几次提交为止,它在我的本地环境和 Heroku 上都运行得很好。我做了一个微小的更改,现在我看到了一个奇怪的错误。是的,回滚修复了错误,但根据我所做的更改,我无法解释为什么 heroku 会给我带来麻烦。
该应用程序从 api 提取图像并将其存储在服务器*上的 tmp 目录中,在该目录中对图像进行编辑。 tmp 目录是 git 存储库的一部分,每次加载页面时都应从 api 中提取图像。我现在在heroku上遇到的错误是:
File "/app/app/views.py", line 71, in edit_result
Jan 17 22:05:23 *** app/web.1: i.save('%s/%s' % (MEDIA_FOLDER, filename))
Jan 17 22:05:23 *** app/web.1: File "/app/.heroku/python/lib/python2.7/site-packages/PIL/Image.py", line 1459, in save
Jan 17 22:05:23 *** app/web.1: fp = builtins.open(fp, "wb")
Jan 17 22:05:23 *** app/web.1: IOError: [Errno 2] No such file or directory: u'/app/tmp/5cfae63a182ff935fe0fb142_640.jpg'
我的 View 文件中的相关行是:
@app.route('/edit/', methods = ['GET', 'POST'])
def edit_result():
url = request.args.get('url')
filename = url.split('/')[-1]
i = Image.open(StringIO(requests.get(url).content))
i.save('%s/%s' % (MEDIA_FOLDER, filename))
return render_template("edit.html",
image_filename=filename,
)
看看工作中的 git 提交与下一个破坏的东西,这就是所有提交的内容:
<option value="Default">Choose Font</option>
已添加到 Jinja2 模板中,@cache.cached(timeout=50)
已从 View 中删除并且 "Default": "/ttf-bitstream-vera/Vera.ttf",
已添加到字典中
还有一些注意事项:
- 我尝试提取错误消息中列出的图像,但它 实际上确实出现在heroku实例上。
- 我想也许我是 混淆了提交并查看了我之前的最后几个 思想是工作提交,接下来的几个是 splinter 的 犯罪。我看不出有什么会导致 heroku 失败, 不是我本地的环境。
- 我(可能很愚蠢)继续在本地环境中开发该应用程序。我还没有完成登录应用程序的编码,所以我在 Heroku 上收到错误 500,并认为这是侥幸。现在,我在 Heroku 部署之前进行了十几次提交,并且发生了很多变化,包括那些为了更好的用户体验而完全删除的破坏的提交。
- 本地一切仍然运行良好。
- tmp 目录的权限未更改
我是 Heroku 新手,这是我在那里部署的第一个应用程序。也许我错过了一些东西,这就是我来找你的原因!任何建议将不胜感激。
*我知道 Heroku 不希望这样的东西存储在本地,我正在重写 View 以使用 S3...
最佳答案
您可以在第一篇文章中 dirn 留下的评论中阅读有关我的答案的更多信息,但本质上我的目录没有像我想象的那样包含在我的 git 存储库中,因此在清除后它不在 heroku dyno 上。我在 view.py 中添加了一个条件来检查目录,如果不存在则创建它,这解决了问题:
if not os.path.exists(MEDIA_FOLDER):
os.makedirs(MEDIA_FOLDER)
关于python - Flask 项目在本地环境中工作,在 Heroku 上抛出关于丢失文件的奇怪错误(无论如何都是动态添加的!),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21205465/