0

在此先感谢您的帮助。

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

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

  1. STATIC_ROOT在我的 settings.py中设置正确的值STATIC_URL(参见下面的代码)。
  2. 跑步:

    $ python manage.py collectstatic
    

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

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

这是我的 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。

如果您需要任何其他信息,请告诉我。

任何帮助都感激不尽 :)

谢谢!

4

2 回答 2

1

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

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

尝试删除

RewriteCond %{REQUEST_URI} !^/static/

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

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

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

于 2013-02-14T20:37:19.343 回答
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将静态文件和RewriteRulecgi 结合起来。但是,这不起作用,因为别名是在重写后评估的,并且必须提前处理静态,因此静态 url 不会传递给 cgi。

了解所有内容的位置很重要,因为.htaccess文件搜索相对于其自身位置的文件。所以这就是它在我的特定环境中寻找的内容。

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

/home/<user>/

有我的用户 www root,包括.htaccess和静态文件:/home//html /home//html/.htaccess /home//html/static

这是里面的两条重要线setting.py

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

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

当我跑

python manage.py collectstatic

我的应用程序和项目静态目录中的所有内容都被复制到STATIC_ROOT. STATIC_URL是引用静态文件的字符串 Django 前缀 url。因此,当 Apache Web 服务器接收到类似的 URL 时http://www.mydomain.com/static/mystyle.css,它需要知道不能将其重定向到 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加到它。[L]正如 Tim Edgar 所解释的那样,它告诉 Apache 更喜欢这条规则。

这对我有用。建议的一些相关答案/static/$1/(带有前缀斜杠)不起作用(因为它不是相对路径)。在我的情况下,该static目录位于也位于的html目录中.htaccess。所以相对路径在这里有效。

如果我要根据 Tim 对我的环境的回答使用 RewriteRule,它应该如下所示:

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

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

于 2014-01-28T16:40:06.957 回答