Django项目使用多个应用程序提供静态文件

时间:2017-01-23 16:23:23

标签: python css django view django-staticfiles

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

enter image description here

我遇到的问题与从主项目的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>

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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)