django不会在生产中提供用户上传的文件

时间:2017-09-19 00:53:22

标签: django nginx django-templates gunicorn django-file-upload

我用django部署了一个网站。它服务于所有静态文件,但不提供用户上传的文件。 这是我的settings.pyurls.py

import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
DEBUG = False

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticroot')
STATICFILES_DIRS = [os.path.join(BASE_DIR, "static")]

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

urls.py

urlpatterns = [
url(r'^admin/', admin.site.urls),    
url(r'^$', Index.as_view(), name='index'),
] 

在页面中,它正确打印用户上传的文件地址,但是当我点击链接时它不显示anf,它显示我404页面。 我使用了从nginx存储库中获取的nginx的最新版本。版本1.12。 它与django或webserver(nginx + gunicorn)有关吗?我该如何解决这个问题?

更新 当我将MEDIA_URLDEBUG更改为True时,它首次运行并提供用户上传的文件,但如果我刷新页面,那么它就不起作用了!问题是什么?

2 个答案:

答案 0 :(得分:0)

您必须在 urls.py

中定义
from django.conf.urls import include, url
from django.conf.urls.static import static
from django.conf import settings
urlpatterns = [
           url(r'^admin/', admin.site.urls),    
           url(r'^$', Index.as_view(), name='index'),
         ]+static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

答案 1 :(得分:0)

这是因为生产中的django不提供静态和媒体文件。这就是为什么当你使DEBUG = True时它可以工作,

您需要做的是在您的服务器块的nginx配置中为媒体文件设置别名,就像静态文件一样:

    location /files/ {
    autoindex on;
    alias /home/your/project/uploaded_files/;
    }

另外,不要忘记之后重新启动你的nginx。