Django的管理员缺少css,图像等 - 无法在共享主机上正确设置静态文件

时间:2013-02-14 20:01:22

标签: django django-admin web-hosting

提前感谢您的帮助。

我正在努力让Django在Bluehost上工作。 Django的管理站点已在http://www.my-domain.com/admin/启用并可访问。但是,整个管理站点看起来像没有样式或图像的普通html - 不像我在使用Django自己的服务器时看到的那样($ python manage.py runserver)。

在寻找解决方案之后,我尝试了以下方法:

  1. 在settings.py中设置STATIC_ROOTSTATIC_URL的正确值(请参阅下面的代码)。
  2. 运行:

    $ python manage.py collectstatic
    

    (由于某种原因,似乎将文件复制到我项目的根文件夹而不是我在settings.py中指定的静态/文件夹)

  3. 访问管理网站 - 仍然看起来像普通的HTML。

  4. 以下是我的settings.py文件摘录:

    import os.path
    import sys
    
    # (some more code here)
    
    PROJECT_ROOT = os.path.normpath(os.path.dirname(__ file__))
    STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static')
    STATIC_URL = '/static/'
    STATICFILES_DIRS = (
        # empty
    )
    STATICFILES_FINDERS = (
        'django.contrib.staticfiles.finders.FileSystemFinder',
        'django.contrib.staticfiles.finders.AppDirectoriesFinder',
    )
    

    以下是我的public_html文件夹中的.htaccess文件的外观:

    AddHandler fcgid-script .fcgi
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_URI} !=/favicon.ico
    RewriteCond %{REQUEST_URI} !^/static/
    RewriteRule ^(.*)$ my_fcgi_file.fcgi/$1 [QSA,L]
    

    请注意以下事项:

    • 我无法访问httpd.conf。
    • 每当我使用“python manage.py collectstatic”时,它会复制项目根文件夹中的文件,而不是我项目的静态文件夹(我在STATIC_ROOT中指定的文件夹)。我尝试将它们手动复制到此文件夹中,但管理站点仍然看起来像普通的HTML。

    如果您需要任何其他信息,请与我们联系。

    任何帮助将不胜感激:)

    谢谢!

2 个答案:

答案 0 :(得分:1)

在.htaccess文件中,您要过滤掉对^ / static /的请求,因此您的重写规则不会适用。如果您将静态文件复制到public_html/static/,则应该看到admin css。

否则,如果要将请求指向静态文件目录

尝试删除

RewriteCond %{REQUEST_URI} !^/static/

并添加规则以指向静态文件所在位置的请求

RewriteRule ^(static/.*)$ path/to/static/files [L]

[L]组件意味着最后一个,并且告诉apache不要为以static开头的路径运行其他规则。

答案 1 :(得分:0)

我也遇到了这个问题的问题,并且能够解决它,所以我想分享这个。

  

每当我使用“python manage.py collectstatic”时,它都会复制文件   我的项目的根文件夹,而不是我项目的静态文件夹(这是   我在STATIC_ROOT中指定的文件夹。

你指定:

PROJECT_ROOT = os.path.normpath(os.path.dirname(__ file__))
STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static')

__file__之间有一个空格。不确定这只是一个副本&过去的问题,但如果Django无法读取设置,这可能是问题。

更有趣的部分是如何弄清楚要使用什么RewriteRule。有人建议将Alias用于静态文件,将RewriteRule用于cgi。但是,这不起作用,因为Alias在重写后被评估,并且必须提前处理静态,因此静态URL不会传递给cgi。

了解所有内容的位置非常重要,因为.htaccess文件会相对于自己的位置搜索文件。所以这就是我对特定环境的看法。

我在具有ssh访问权限的虚拟服务器上运行Django,这意味着我无法访问/srv/www,例如所以一切都在我的主目录中的位置:

/home/<user>/

我的用户是www root,包括.htaccess和静态文件:     /家// HTML     /home//html/.htaccess     /家庭// HTML /静态

这是setting.py中的两个重要行。

STATIC_URL = '/static/'
STATIC_ROOT = '/home/<user>/html/static/'

我没有STATICFILES_DIRSSTATICFILES_FINDERS,因为我在Django 1.6.1中使用默认值。

当我跑步时

python manage.py collectstatic

我的应用程序和项目静态目录中的所有内容都被复制到STATIC_ROOTSTATIC_URL是字符串Django前缀引用静态文件的URL。因此,当Apache Web服务器收到类似http://www.mydomain.com/static/mystyle.css的URL时,它需要知道不能将其重定向到Django以及在哪里查找文件mystyle.css

所以这是我的.htaccess

RewriteEngine on
RewriteRule ^static/(.*)$ static/$1 [L]
RewriteRule ^(.*)$ /fcgi-bin/<django-fcgi-file>/$1 [QSA,L]

如你所见,我正在使用fcgi,其他人可能会使用wsgi,但这不是问题。更重要的是,我添加了这一行RewriteRule ^static/(.*)$ static/$1 [L]

它告诉Apache,每当一个URL以static开头(没有前缀斜杠!)时,它应该将(.*)后面的所有内容(将被引用为$1)重定向到目录static并将$1附加到其中。 Tim Edgar解释的[L]告诉Apache更喜欢这条规则。

这就是我的伎俩。一些相关的答案建议/static/$1/(带有前缀斜线)不起作用(因为它不是相对路径)。就我而言,static目录位于html目录中.htaccess所在的目录。所以相对路径在这里起作用。

如果我根据Tim对环境的回答使用RewriteRule,它应该是这样的:

RewriteRule ^(static/.*)$ $1 [L]

目标路径很简单$1,因为匹配已包含单词static/