10

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

  1. 您会推荐哪台服务器来提供易于安装和维护的静态文件?
  2. 假设我真的让服务器启动并运行,那么呢?我如何告诉 Django 在其他服务器上查找文件?
  3. 同样,有人有分步教程吗?

非常感谢!

4

4 回答 4

5

抱歉,没有分步教程。但这里有一个可能有帮助的高级概述:

  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 (http://docs.djangoproject.com/en/dev/howto/static-files/),您可以使用 ./manage.py collectstatic 来执行此操作。

所以诀窍是你没有告诉 Django 将提供静态文件的服务委托给特定的服务器。而是告诉 httpd 哪些 url 是通过 Django 提供的,哪些 url 是静态文件。

另一种说法是所有请求都到达 Apache Web 服务器。网络服务器根据你在 httpd.conf 中指定的规则,将决定请求是针对静态文件还是针对 django 生成的动态文件。如果它用于静态文件,它将简单地提供文件。如果请求是针对动态文件的,它将通过 modpython 将请求传递给 Django。

希望有帮助。

于 2011-04-22T15:02:25.210 回答
4

发展

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_ROOTDjango 用来收集所有静态文件的文件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)}),)

更详细的文章如下:

于 2015-03-16T22:08:53.970 回答
0

更新了 urls.py

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

你需要这样做:

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/

于 2020-06-21T08:36:33.600 回答
0

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

所以我找到了一个来自多个堆栈溢出帖子的解决方案。

  1. 导入适当的函数
from django.urls import include, path, re_path
from django.views.static import serve
  1. 定义静态 URL 模式列表
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}),
]

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

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

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

于 2021-12-09T17:01:52.190 回答