我可以使用 'runserver' 在本地加载静态文件,但不能在生产环境中加载

I can load static files locally with 'runserver' but not in production

我可以使用 'runserver' 在本地加载静态文件,但不能在生产环境中加载。 我成功地设法在生产中加载模板,但没有加载静态文件。

在 .html 页面中,我包含了以下行:

<!DOCTYPE html>
{% load staticfiles %} 

... ...

<img src="{% static "images/mypic.jpg" %}" alt="this pic" />

我在 settings.py 中的设置包括这些行

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATIC_DIR = os.path.join(BASE_DIR, 'static')
STATICFILES_DIRS = [STATIC_DIR, ]
STATIC_URL = '/static/'

在 urls.py 我有:

from django.conf.urls.static import static

urlpatterns = [
    url(r'^$', views.index, name='index'), 
    url(r'^pages/', include('pages.urls')), 
    url(r'^admin/', admin.site.urls),
    url(r'about^$', views.about, name='about'),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

我已经尝试了几个小时了,知道为什么我无法访问它们吗?

(错误!!!)

我通过添加解决了这个问题:

+ static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

我的应用程序 urls.py 和主应用程序 urls.py

在产品系统中,不建议使用 link 来归档,并且由于 DEBUG=TRUE 可能会工作。 在产品环境中总是更好地使用像 nginx 这样的网络服务器并通过网络服务器加载静态

所以,我的问题是有缺陷的。 正如许多人正确指出的那样,您需要在生产环境中使用网络服务器来提供静态文件(我不知道,因为我没有经验)。

此外,我提出的解决方案非常糟糕,因为您不应该添加该行 +静态(settings.STATIC_URL,document_root=settings.STATIC_ROOT)

问题在于不同的托管服务有不同的设置方式,而且用户通常无法调整 Apache 配置或者设置 nginx 服务器并不容易。解决方案:

whitenoise

简单、美观、完美。 几行代码就可以解决所有问题,而不必为了学习如何编写 Apache/nginx 网络服务器而将头撞到墙上。

使用白噪声你需要做的是:

  1. 安装 whitenoise 包
  2. 按照说明中的说明更改您的 wsgi 应用,添加

    from whitenoise import WhiteNoise

    ...

    application = get_wsgi_application() application = WhiteNoise(application,root='/mypath/static')

  3. 更改 settings.py 并在中间件中启用 whitenoise 类 ]

  4. 运行 collectstatic

    python manage.py collectstatic

我做的不是做的是:

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

但我将 static_root 路径保留为: STATIC_ROOT = STATIC_DIR

我不知道为什么,但这样就可以了

我希望这对那些无法在 django 生产环境中提供静态文件的人有用