无法从工作人员访问文件,但在视图中工作 - [Errno 2] 没有这样的文件或目录

Cannot access a file from worker, but works in the view - [Errno 2] No such file or directory

我已按照 https://devcenter.heroku.com/articles/python-rq

上的教程进行操作

假设我有一个功能可以将 PDF 文件转换为 JPG 并将它们存储在应用程序的 tmp/file/ 中,然后将其上传到 S3。

但是,由于heroku上的请求超时是30s,我无法将其放入View中,所以我决定使用后台工作程序来执行任务。所以我将代码移到了任务中,但是工作人员无法找到正确的路径。

[Errno 2] No such file or directory。我试过不走运地打印,但我可以在函数中打印。

我尝试调用的在任务中给出空字符串但在视图中给出正确值的函数是sorted(os.listdir('tmp/file/')

我四处搜索并认为 PYTHONPATH 变量可能是错误的,但一切都通过 manage.py

我的 worker.py 看起来像这样。

import os
import redis
import sys
from rq import Worker, Queue, Connection

listen = ['high', 'default', 'low']
os.environ['DJANGO_SETTINGS_MODULE'] = 'cinnamon_rest.settings'

redis_url = os.getenv('REDISTOGO_URL', 'redis://localhost:6379')

conn = redis.from_url(redis_url)

if __name__ == '__main__':
    with Connection(conn):
        worker = Worker(map(Queue, listen))
        worker.work()

我的 manage.py 看起来像这样。

#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "cinnamon_rest.settings")

    from django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)

worker和web dynos不共享文件系统;它们就像容器(我 Heroku 在幕后使用 LXC 容器,就像 Docker)。 git 存储库中存在的文件或由构建过程生成的文件将存在(因为它们被组装到用于启动容器的 "slug" 中),但任何动态写入的文件将只存在在该特定容器看到的文件系统中。您将需要使用外部存储机制在容器之间共享 file/blob 数据,例如 https://django-storages.readthedocs.io/en/latest/