Django管理后台不提供静态文件?

16 投票
7 回答
48221 浏览
提问于 2025-04-18 06:56

Django 1.6

我在使用Django Admin的时候,遇到了静态文件无法正常显示的问题。

urls.py:

urlpatterns = patterns('',
    url(r'^$', 'collection.views.index', name='home'),
    url(r'^collection/', include('collection.urls')),
    url(r'^admin/',    include(admin.site.urls)),
)

if settings.DEBUG:
    urlpatterns += patterns('',
        url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {
            'document_root': settings.MEDIA_ROOT,
        }),
        url(r'^static/(?P<path>.*)$', 'django.views.static.serve', {
            'document_root': settings.STATIC_ROOT,
        }),
)

settings.py

...
MEDIA_ROOT = '/Users/me/projectdir/media/'
MEDIA_URL = 'media/'

STATIC_ROOT = '/Users/me/projectdir/static/'
STATIC_URL = 'static/'
...

模板 (base.html)

<!DOCTYPE html>
<html lang='en-us'>
<head>
<title>Mysite</title>

{% load static %}
{% block links %}
    <link href="{% static 'css/bootswatch-simplex.css' %}" rel="stylesheet" type="text/css">
    <link href="{% static 'css/custom.css' %}" rel="stylesheet" type="text/css">
    <link rel="shortcut icon" href="{% static "favicon.ico" %}">
{% endblock %}

<script src="{% static "lib/bootstrap-3.1.1-dist/js/bootstrap.js" %}"></script>
<script type="text/javascript">window.__admin_media_prefix__ = "{% filter escapejs %}{% static "admin/" %}{% endfilter %}";</script>
</head>
...

Django的管理界面可以正常工作,但静态文件,比如CSS和JS等却无法显示。

我公共页面的静态文件倒是没问题。

如果我把STATIC_URL改成'/static/',那么情况就反过来了:管理界面没问题,但我的公共页面的静态文件就消失了。

最奇怪的是,如果我在浏览器中查看管理页面的源代码,它显示的静态文件的URL是正确的,比如:

/static/admin/css/base.css

但如果我真的点击这个链接,它却变成了这样:

http://localhost:8000/admin/static/admin/css/base.css

我觉得它在检查静态文件时,是相对于localhost:8000/admin/static/来找的,而不是localhost:8000/static/。它在URL中多加了一个"admin"的层级,就好像static是域名的一部分。我就是搞不清楚怎么去掉这个多余的部分。

我试过使用collectstatic,但没有帮助。静态文件确实在我的静态目录里,只是没有被正确提供。我可以直接输入,比如http://localhost:8000/static/admin/css/base.css,这样能拿到正确的CSS文件(以纯文本形式显示)。文件是存在的。我觉得我的配置可能有问题。

我已经清空了缓存,重启了开发服务器等等,但还是没用。

有没有什么想法?

7 个回答

1

如果这对谁有帮助,我想分享一下我代码中的问题。可能是我自己的愚蠢错误,但也许能节省别人的时间:

基本上,我的 settings.py 文件里的变量是这样的:

AWS_S3_CUSTOM_DOMAIN = f"{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com/"
STATIC_URL = f"https://{AWS_S3_CUSTOM_DOMAIN}/static/"

我查看了管理页面的 CSS src 标签,发现 URL 是这样的: (注意 URL 中有两个斜杠)
https://bucket-name.s3.amazonaws.com//admin/css/login.css

所以我稍微修改了一下我的变量,结果一切都正常加载了。

AWS_S3_CUSTOM_DOMAIN = f"{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com"
STATIC_URL = f"https://{AWS_S3_CUSTOM_DOMAIN}/static/"

这样就修正了错误的 URL,静态文件也完美加载了。

1

首先,你需要尝试运行:python manage.py collectstatic。如果出现任何错误,就按照以下步骤操作。

步骤1

**从你的 settings.py 文件中删除这些代码**

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"),
    '/home/uour project/src/project name/static/',
)  //remove these lines

步骤2

这些代码替换掉它

STATIC_ROOT = os.path.join(BASE_DIR, 'static') //add these line

步骤3

打开终端,输入:python manage.py collectstatic

3

我遇到过同样的问题两次。 我解决这个问题的方法是把管理界面的静态文件粘贴到代码中提到的静态文件夹里 -

cp -r /usr/local/lib/python2.7/site-packages/django/contrib/admin/static/admin /home/ec2-user/mywork-Deployment/mywork/static

这个方法绝对有效,能节省很多时间和麻烦。 希望对你有帮助!

12

你可以使用 django-admin.py collectstatic 命令,或者直接去 ~/django/contrib/admin/static 这个文件夹,把里面的 admin 文件夹(里面有静态文件)复制到你项目的静态目录里。

**编辑**

如果你遇到问题,可以试试这个比较笨的方法:把你的 STATIC_URL 改成 '/static/'。我在问题中看到这样一句话:

如果我把 STATIC_URL 改成 '/static/',那么情况就反过来了:管理员界面没问题,但我的公共页面的静态文件就没了。

然后你可以用 inspect element/firebug 来检查一下,看看公共页面上加载了哪些网址。可能是少了一个 '/' 或者多了一个 '/'. 调整一下,看看能不能解决问题。

8

好的,我搞明白了。我的设置文件里有些地方搞混了,我没有正确设置 STATICFILES_DIRS

最后,我按照 《Django 1.6的两勺子》 里讨论的版本控制设置文件来做,在我的 settings 里加了这些内容:

from unipath import Path

BASE_DIR         =  Path(__file__).ancestor(3)
MEDIA_ROOT       =  BASE_DIR.child('media')
STATIC_ROOT      =  BASE_DIR.child('static')

TEMPLATE_DIRS    = (
    BASE_DIR.child('templates'),
)

STATICFILES_DIRS = (
    BASE_DIR.child('myapp').child('static'),
)

STATIC_URL         = '/static/'
MEDIA_URL          = '/media/'

这样一来,我的静态文件就能正常显示了,无论是在管理后台还是其他地方。不过,我的媒体文件在开发环境下没有正常工作,需要修改我的 urls.py,具体可以参考这个被接受的答案 这里。而我的静态文件就不需要这样处理。

总之,希望这能帮助到其他在这个问题上碰壁的人。

撰写回答