在Django生产教程中提供静态文件服务

14

有没有一个简单的,关于在Django生产应用程序上提供静态文件的逐步教程?我阅读了Django docs,它听起来真的很复杂...我试图使用不同的服务器(如lighttpd、nginx或cherokee)来提供静态文件,但是设置这些服务器对我来说都是希腊文。我下载了lighttpd,尝试按照说明进行安装,在几秒钟内就出现了错误。缺少这个或那个或其他什么东西......我不是UNIX专家,也不擅长C/C ++,所以所有这些"./configure"和"MAKE install"对我来说都是胡言乱语...所以我想问的问题是:

  1. 你推荐哪个服务器可以轻松安装和维护,用于提供静态文件?
  2. 假设我真的启动并运行了服务器,那么接下来怎么办?我如何告诉Django在另一台服务器上查找文件?
  3. 再次问一遍,有人有逐步教程吗?

非常感谢!


你在寻找这个吗?hhttp://docs.djangoproject.com/en/1.3/howto/static-files/ 它看起来是一步一步的。 - S.Lott
是的,我已经阅读了那份文档。但我觉得它不够详细。比如说,里面有没有回答我的第二个问题?也许我错过了...谢谢! - rabbid
@rabbid:在重新阅读了你的问题(相当令人困惑)之后,我认为那个链接是错误的。 - S.Lott
@rabbid:不要道歉。修正问题。简化。聚焦。澄清。 - S.Lott
@rabbid:对于Django应用程序,我只能推荐Cherokee Web服务器。它比带有mod_python的Apache性能更高,并且可以通过其Web界面轻松配置。但是:很抱歉告诉您,如果您想安装支持Django(通过uWSGI)的Cherokee Web服务器,则很可能需要自己编译一个或两个模块。这需要一些基本的Linux知识。 - mbaechtold
显示剩余2条评论
4个回答

6
抱歉,没有逐步教程。但是以下概述可能会有所帮助:
  1. 您可能想选择Apache服务器(http://httpd.apache.org/)。这是大多数*nix发行版的标配。
  2. 然后,您需要使用mod python(或者如评论者所指出的mod_wsgi:http://docs.djangoproject.com/en/dev/howto/deployment/modwsgi/)来连接Django:http://docs.djangoproject.com/en/dev/howto/deployment/modpython/?from=olddocs。完成此步骤后,Apache现在是Django的前端。
  3. 接下来,您需要将Django中的静态文件收集到一个目录中,并将apache指向该目录。如果您使用了django.contrib.staticfiles,则可以使用./manage.py collectstatic来完成此操作(http://docs.djangoproject.com/en/dev/howto/static-files/)。
因此,诀窍在于您不是告诉Django将静态文件服务委托给特定服务器。相反,您要告诉httpd哪些url是通过Django提供的,哪些url是静态文件。
换句话说,所有请求都会发送到Apache Web服务器。根据您在httpd.conf中指定的规则,Web服务器将决定请求是静态文件还是由Django生成的动态文件。如果它是静态文件,则只需提供该文件。如果请求是动态文件,则通过modpython将请求传递给Django。
希望这有所帮助。

1
现在,wsgi或uwsgi绝对是首选的方式。mod_python速度较慢,不久将不再得到支持。http://docs.djangoproject.com/en/dev/howto/deployment/modwsgi/ - Jordan
谢谢你的回复。是的,我明白你的意思。我已经从官方Django文档中读到了很多。看起来你正在描述如何通过Apache提供应用程序本身。你是说也要通过Apache提供静态文件吗?我认为文档说这不是一个推荐的路线。你认为这样做可以吗?我选择的路线是通过不同的服务器(如lighttpd或cherokee)提供静态文件。然而,我完全不舒服地从源代码进行MAKE和安装,并手动配置所有内容。我也不知道lighttpd/cherokee如何与我的Django应用程序通信。 - rabbid
@rabbid:从Apache提供静态媒体是可以的——但您不希望使用Django的开发服务器来提供应用程序及其媒体。 - mipadi
@mipadi:当然,我不会在生产环境中使用开发服务器。我想我会先尝试从同一个Apache服务器提供静态文件。谢谢! - rabbid
@rabbid:我认为文档实际上告诉你要使用Apache来提供静态文件。他们告诉你不要在生产环境中使用开发服务器,也不要通过Django提供静态文件。 - Karthik Ramachandran

4

最近使用最新的Django版本,例如Django 3.2.6时,我在开发环境和生产环境中都遇到了在DEBUG=False的情况下提供媒体和静态文件的问题。

因此,我采取了多个Stack Overflow帖子中的解决方案。

  1. 将适当的函数导入到urls.py
from django.urls import include, path, re_path
from django.views.static import serve

将静态的URL模式列表定义到urls.py中。
static_urlpatterns = [
    re_path(r"^media/(?P<path>.*)$", serve, {"document_root": settings.MEDIA_ROOT}),
    re_path(r"^static/(?P<path>.*)$", serve, {"document_root": settings.STATIC_ROOT}),
]

假设你已经在 settings.py 文件中定义了 STATIC_ROOTMEDIA_ROOT
只需在 urlpatterns 中包含 static_urlpatterns
urlpatterns = [
    path("admin/", admin.site.urls),
    path("api/", include(api_urlpatterns)),
    path("", include(static_urlpatterns)),
]

希望在 DEBUG = FALSE 的开发和生产环境中,它能对你们两个都起作用。谢谢。

谢谢分享!有个问题,1和2放在哪里?urls.py还是settings.py? - mm_
1和2都应该放在urls.py中。感谢提及@mm_。 - Mobasshir Bhuiya

3

开发

STATICFILES_DIRS 应该包含所有静态目录,其中所有静态文件都驻留在其中。

STATIC_URL 如果您的文件在本地机器上,则应为 /static/,否则请在此处放置基本 URL,例如 http://example.com/

INSTALLED_APPS 应包括 django.contrib.staticfiles

在模板中,加载 staticfiles 模块:

{% load staticfiles %}
<img src='{% static "images/test.png" %}' alt='img' />

生产环境

STATIC_ROOT 添加到 Django 中,以从 STATICFILES_DIRS 收集所有静态文件。

收集静态文件:

$ python manage.py collectstatic

将路径添加到 urls.py 中:
from . import settings

urlpatterns = patterns('',
..
    url(r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root':settings.STATIC_ROOT)}),)

以下是更详细的文章:

这些文章与在Django中提供静态文件相关,可以帮助您更好地了解如何处理这个问题。

1

已更新至urls.py

url(....) 格式在 Django 3.0.7 中不再适用于 urls.py

您需要进行以下操作:

urls.py:

from django.conf import settings # to import static in deployment
from django.conf.urls.static import static # to import static in deployment
....
urlpatterns = [
....

] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) # to import static in deployment

参考资料:https://docs.djangoproject.com/en/3.0/howto/static-files/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接