【问题标题】:Django Project Serving Static Files With Several AppsDjango 项目为多个应用程序提供静态文件
【发布时间】:2017-06-08 05:36:57
【问题描述】:

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

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

谁能告诉我我做错了什么?此外,在处理多个应用程序时提供静态文件的最佳做法是什么?将所有样式和脚本转储到项目根目录中的公共 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>

【问题讨论】:

    标签: python css django view django-staticfiles


    【解决方案1】:

    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)
    

    【讨论】:

    • 问题是这似乎不起作用。当我以与您相同的方式指定 STATIC_ROOT 时,仍然找不到我的 CSS 文件。有没有办法测试这个?另外,我是否正确理解collectstatic 将查看每个应用程序内的静态文件夹并将它们物理移动到STATIC_ROOT 指定的任何内容中?
    • 是的,collectstatic 会查看每个应用程序内的所有静态文件夹,并将它们移动到 static_root 指定的文件夹中。在您的浏览器中检查源中 css 文件的 url,看看它是否符合预期?
    • 网址像这样"/static/css/bootstrap.min.css" 出现,但找不到。目前我不确定 Django 将什么视为应用程序的根点。
    • 我能找到的唯一文件是static/css/blog.css,但这个文件位于blog 应用程序的static 目录中。似乎 Django 以某种方式抓住了那个?
    • 引导文件放在哪里?您是否对 static_root 和 urls.py 进行了更改?
    【解决方案2】:

    “将所有样式和脚本转储到一个公共静态目录”正是collectstatic 命令所做的。您应该运行它,并配置您的服务器以从那里提供文件。

    首先,您应该将 STATIC_ROOT 设置设置为指向该公共目录,而不是在您的应用程序内部。

    【讨论】:

    • 您能详细说明一下吗?
    • 呃,具体是什么?
    • 在哪里运行命令,如何修复代码。如果我对框架非常了解,我不会问这个问题。
    猜你喜欢
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 2020-12-05
    • 2020-04-18
    • 1970-01-01
    • 2014-07-19
    相关资源
    最近更新 更多