在Django生产教程上提供静态文件

rab*_*bid 5 django static lighttpd nginx cherokee

有没有人提供有关在Django生产应用程序上提供静态文件的简单分步教程?我阅读了Django 文档,这听起来确实很复杂...我试图使用诸如lighttpd,nginx或cherokee之类的其他服务器来提供静态文件,但是对我来说,设置这些都是希腊文。我下载了lighttpd,尝试按照说明进行安装,并在几秒钟内得到了一个错误。缺少这个或那个或其他...我不是UNIX专家,我也不擅长C / C ++,所以所有这些./configure和MAKE安装对我来说都是胡言乱语...所以我想我眼前的问题是:

  1. 您建议使用哪一台服务器来提供易于安装且易于维护的静态文件?
  2. 假设我实际上已启动服务器并开始运行,那又如何呢?如何告诉Django在另一台服务器上查找文件?
  3. 再有,有人有分步教程吗?

非常感谢!

Kar*_*ran 5

抱歉,没有逐步教程。但是,这里有一个概述可能会有所帮助:

  1. 您可能想使用Apache服务器(http://httpd.apache.org/)。大多数* nix发行版都附带了该服务器。
  2. 然后,您要使用MOD蟒蛇(或作为评论者指出的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.static文件(http://docs.djangoproject.com/en/dev/howto/static-files/。),则可以使用./manage.py集合静态函数来执行此操作。

因此,诀窍是您不告诉Django将提供的静态文件委派给特定的服务器。相反,您要告诉httpd哪些URL是通过Django提供的,哪些URL是静态文件。

换句话说,所有请求都到达Apache Web服务器。根据您在httpd.conf中指定的规则,网络服务器将决定该请求是针对静态文件还是针对django生成的动态文件。如果它是静态文件,它将仅提供文件。如果请求是针对动态文件的,它将通过modpython将请求传递给Django。

希望能有所帮助。


Mob*_*iya 5

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

因此,我找到了来自多个堆栈溢出帖子的解决方案。

  1. 导入适当的函数urls.py
from django.urls import include, path, re_path
from django.views.static import serve
Run Code Online (Sandbox Code Playgroud)
  1. 定义静态 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}),
]
Run Code Online (Sandbox Code Playgroud)

假设您的STATIC_ROOTandMEDIA_ROOT已在settings.py文件中定义

  1. 只需包含static_urlpatternsurlpatterns
urlpatterns = [
    path("admin/", admin.site.urls),
    path("api/", include(api_urlpatterns)),
    path("", include(static_urlpatterns)),
]
Run Code Online (Sandbox Code Playgroud)

希望它在开发和生产环境中都适用于您DEBUG = FALSE。谢谢。