Django权限被拒绝:'/ media / images'上传图像

时间:2019-04-30 12:15:22

标签: django

请帮助。我正在尝试遵循以下教程https://wsvincent.com/django-image-uploads/ 尝试在该部分中发布djangopony.png图像后,我立即收到权限拒绝错误。我正在使用Ubuntu 19和Django 2.1.5。

我的虚拟环境和项目位于目录中 / home / sgoodman / insta

├── db.sqlite3
├── insta_project
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── manage.py
├── media
│   └── images
├── Pipfile
├── Pipfile.lock
└── posts
    ├── admin.py
    ├── apps.py
    ├── __init__.py
    ├── migrations
    │   ├── 0001_initial.py
    │   └── __init__.py
    ├── models.py
    ├── tests.py
    └── views.py

权限:

drwxrwxrwx 5 sgoodman sgoodman   4096 Apr 30 13:53 ./
drwxr-xr-x 9 sgoodman sgoodman   4096 Apr 30 13:50 ../
-rw-r--r-- 1 sgoodman sgoodman 135168 Apr 30 13:53 db.sqlite3
drwxrwxr-x 2 sgoodman sgoodman   4096 Apr 30 13:50 insta_project/
-rwxrwxr-x 1 sgoodman sgoodman    545 Apr 30 12:57 manage.py*
drwxrwxrwx 3 sgoodman sgoodman   4096 Apr 30 13:46 media/
-rw-rw-r-- 1 sgoodman sgoodman    176 Apr 30 12:56 Pipfile
-rw-r--r-- 1 sgoodman sgoodman   3914 Apr 30 12:56 Pipfile.lock
drwxrwxr-x 3 sgoodman sgoodman   4096 Apr 30 13:46 posts/
settings.py中的

MEDIA_ROOT和MEDIA_URL设置:

STATIC_URL = '/static/'

MEDIA_ROOT = '/media/'
MEDIA_URL = os.path.join(BASE_DIR, '/media/')

谢谢。

1 个答案:

答案 0 :(得分:0)

最后我自己解决了这个问题。

在开发计算机上运行时,实际上我正在使用当前用户的特权运行。但是,在部署服务器上运行时,实际上我正在运行wsgi,这意味着它正在使用www-data的特权运行。

www-data既不是所有者,也不在拥有/var/www的用户组中。这意味着www-data被视为other并已将权限设置为其他权限。

对此的不良解决方案是:

sudo chmod -R 777 /var/www/

这将使所有人都可以完全访问/var/www/which is a very bad idea中的所有内容。

另一种不良解决方案是:

sudo chown -R www-data /var/www/

这会将所有者更改为www-datawhich opens security vulnerabilities

良好的解决方案是:

sudo groupadd varwwwusers
sudo adduser www-data varwwwusers
sudo chgrp -R varwwwusers /var/www/
sudo chmod -R 760 /var/www/

这会将www-data添加到varwwwusers组,然后将其设置为/var/www/及其所有子文件夹的组。 chmod将向所有者授予读取,写入和执行权限,但是,例如,如果Web服务器被黑客入侵,则该组将无法执行可能在其中上载的任何脚本。

您可以将其设置为740,以使其更安全,但是您将无法使用Django's collectstatic功能,因此请坚持使用760,除非您对您的工作非常有信心。