Skip to main content
 首页 » 编程设计

python之Django 元素为多个应用程序提供静态文件

2024年10月17日35duanxz

我的 Django 元素中有以下结构。如您所见,有一个名为“博客”的应用程序以及与元素本身同名的主应用程序。

我遇到的问题与从主元素的 static 目录提供静态文件有关。 blog 应用程序有自己的 static 目录,并且可以正确提供这些文件(在遍历相关 URL 路由时)。

有人能告诉我我做错了什么吗?另外,在处理多个应用程序时提供静态文件的最佳做法是什么?将所有样式和脚本转储到元素根目录中的公共(public) static 目录是否明智,还是将应用与应用完全分开更好?

settings.py

import os 
 
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 
 
STATIC_ROOT = os.path.join(BASE_DIR, "..", "django_by_example_blog", "static") 
STATIC_URL = '/static/' 

urls.py

urlpatterns = [ 
    url(r'^$', TemplateView.as_view(template_name="base.html")), 
    url(r'^admin/', include(admin.site.urls)), 
    url(r'^blog/', include('blog.urls', namespace='blog', app_name='blog')), 
] 

base.html

{% load staticfiles %} 
<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8"> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    <meta name="description" content=""> 
    <meta name="author" content=""> 
    <title>Home | Triangle</title> 
    <link href="{% static "css/bootstrap.min.css" %}" rel="stylesheet"> 
    <link href="{% static "css/font-awesome.min.css" %}" rel="stylesheet"> 
    <link href="{% static "css/animate.min.css" %}" rel="stylesheet">  
    <link href="{% static "css/lightbox.css" %}" rel="stylesheet">  
    <link href="{% static "css/main.css" %}" rel="stylesheet"> 
    <link href="{% static "css/responsive.css" %}" rel="stylesheet"> 
 
    <!--[if lt IE 9]> 
        <script src="{% static "js/html5shiv.js" %}></script> 
        <script src="{% static "js/respond.min.js" %}"></script> 
    <![endif]-->        
    <link rel="shortcut icon" href="{% static "images/ico/favicon.ico" %}"> 
    <link rel="apple-touch-icon-precomposed" sizes="144x144" href="{% static "images/ico/apple-touch-icon-144-precomposed.png" %}"> 
    <link rel="apple-touch-icon-precomposed" sizes="114x114" href="{% static "images/ico/apple-touch-icon-114-precomposed.png" %}"> 
    <link rel="apple-touch-icon-precomposed" sizes="72x72" href="{% static "images/ico/apple-touch-icon-72-precomposed.png" %}"> 
    <link rel="apple-touch-icon-precomposed" href="{% static "images/ico/apple-touch-icon-57-precomposed.png" %}"> 
</head><!--/head--> 
 
<body> 

请您参考如下方法:

STATIC_ROOT 指定运行 collectstatic 命令时所有静态文件将转储到的文件夹

python manage.py collectstatic 

您似乎已将应用的静态文件夹之一指定为 static_root。

最好给另一个文件夹来保存所有静态文件。

STATIC_ROOT = os.path.join(BASE_DIR, "static") 

当您运行 collectstatic 命令时,它会收集所有静态文件并将它们放入 STATIC_ROOT 文件夹中。

不过,在 DEBUG=True 中运行时,您不必担心这些。 Django 将提供所有静态内容(包括来自单个应用程序中的内容),但在生产环境中不建议这样做,提供静态内容将是 Web 服务器的工作。

编辑:

您还需要在您的基础 urls.py 中指定

from django.conf.urls.static import static 
from django.conf import settings 
 
if settings.DEBUG: 
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)