提前感谢您的帮助。
我正在努力让Django在Bluehost上工作。 Django的管理站点已在http://www.my-domain.com/admin/启用并可访问。但是,整个管理站点看起来像没有样式或图像的普通html - 不像我在使用Django自己的服务器时看到的那样($ python manage.py runserver
)。
在寻找解决方案之后,我尝试了以下方法:
STATIC_ROOT
和STATIC_URL
的正确值(请参阅下面的代码)。运行:
$ python manage.py collectstatic
(由于某种原因,似乎将文件复制到我项目的根文件夹而不是我在settings.py中指定的静态/文件夹)
访问管理网站 - 仍然看起来像普通的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]
请注意以下事项:
STATIC_ROOT
中指定的文件夹)。我尝试将它们手动复制到此文件夹中,但管理站点仍然看起来像普通的HTML。如果您需要任何其他信息,请与我们联系。
任何帮助将不胜感激:)
谢谢!
答案 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_DIRS
和STATICFILES_FINDERS
,因为我在Django 1.6.1中使用默认值。
当我跑步时
python manage.py collectstatic
我的应用程序和项目静态目录中的所有内容都被复制到STATIC_ROOT
。 STATIC_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/
。