我试图让我的Django站点的用户通过模型上的FileField上传文件(通常是PDF)到我的服务器。 但是,当我试图使用由我的模型生成的上传字段时,我一直运行到“Errno 13 Permission Denied”。
在四处搜寻时,我发现了很多潜在的解决scheme,但到目前为止还没有能够正常工作。 这是我第一次真正的部署,我可能会困惑自己。 作为参考,我在Ubuntu 14.04,Django 1.6和gunicorn + nginx上。
现在,我的媒体根目录位于我的项目目录中:
BASE_DIR = os.path.dirname(os.path.dirname(__file__)) MEDIA_ROOT = os.path.join(BASE_DIR, "media/uploads")
错误表明正确的目录有问题,所以它是正确的位置。
我试图chown -r
媒体目录到www-data:www-data
没有成功。 我戳了一下,找出用户正在运行python进程,并试图将“他”作为所有者 – 没有工作。 我把它翻转回原来的所有者和组( root:root
),并尝试将chmod -r
改为755和770,这两者也未能解决问题。
如果我chmod -r
到777,那么一切都“有效” – 但这不是我想暴露的原因明显的原因。
我的静态文件正在从我的项目根目录(/ var / www / mysite / static)以外的目录收集和正确的服务,所以我试着移动媒体文件夹,并重复上述所有步骤 – 相同的结果。
如何让我的媒体文件夹安全地接受我的用户的上传和下载,而不必将这个安全漏洞打开?
谢谢!
首先,媒体文件夹必须在你项目的路径中,否则你将从django获得SuspiciousOpertion
异常,所以不要把它放在/ var / www中。 另外事实上,你使用的是nginx,不是那么相关,重要的是哪个用户是nginx / django项目运行在哪个用户(通常是www-data,至少是apache + mod_wsgi),用户应该是媒体文件夹的所有者。 一旦你更改所有者到正确的用户(我假设万维网数据): sudo chown -R www-data:www-data .../media
,请确保权限是正确的: sudo chmod -R u+rwX .../media
。
希望它有帮助。 让我知道如果没有。 🙂
尝试在你的nginx conf文件中加入max_body_size
server { ... client_max_body_size 250M; ... }
默认情况下它被设置为1M,这可能太小,取决于你上传的内容。