苦苦于django层次结构 - 不提供admin css

时间:2013-12-17 18:54:37

标签: python django apache mod-wsgi

我正在尝试通过django教程,但是已经挂断了显示与admin模块关联的css。我正在使用django 1.6,apache和MySQL

在windows上工作

我目前的等级如下:

MySite
|
|---static
|   |--admin
|      |--css
|      |--img
|      |--js  
|---MyApp
|   |--__init__.py
|   |--admin.py
|   |--models.py
|   |--tests.py
|   |--views.py
|---MySite
|   |--__init.py
|   |--settings.py
|   |--testdb.py
|   |--urls.py
|   |--wsgi.py
|--manage.py
在settings.py文件中

我已将STATIC_URL定义为

STATIC_URL = '/MySite/static/'

当我检查生成的管理页面时,它显示它正在MySite / static / admin / css中查找css,这就是它所在的位置,但它没有在那里找到它。看来根本不正确。

在我的urls.py中我有

admin.autodiscover()

urlpatterns = patterns('',  
    url(r'^admin/', include(admin.site.urls)),
)

修改

我的Apache htttpd.conf文件完全不受XAMPP最初安装的影响,除非我在适当的位置包含了* LoadModule wsgi_module modules / mod_wsgi.so *,并附加了

WSGIScriptAlias /MySite F:/Web_Django/MySite/MySite/wsgi.py
WSGIPythonPath F:/Web_Django/MySite
<Directory F:/Web_Django/MySite/MySite/>
<Files wsgi.py>
Order deny,allow
Allow from all
</Files>
</Directory>

我已将整个文件包含在http://pastebin.com/AD77f69c


EDIT2:

我发现在使用apache时你需要稍微改变一下wsgi.py文件。我现在有以下内容,但问题仍然存在。

import os
import sys

path = 'f:/web_django/Nutana/'
if path not in sys.path:
    sys.path.append(path)

os.environ['DJANGO_SETTINGS_MODULE'] = 'Nutana.settings'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

用于apache的modwsgi适配器的开发人员Graham Dumpleton提供了一个备用的wsgi文件,他(以及其他许多人,显然)认为在旧的博客文章(http://tinyurl.com/y8wr7gc)中效果更好,但它没有为我工作。

2 个答案:

答案 0 :(得分:1)

修改

当然,至少在本地更好地在项目本身内进行项目自定义。这预计使用collectstatic准备将网站从我的开发机器上移开。按照@LGama的建议,我已将其移至项目中并更新了别名,如下所示。


@DanielRoseman评论说我“必须实际配置Apache来提供静态文件”,当然我认为我在做!通过返回apache错误日志文件,并查阅这个类似的问题(Apache not serving django admin static files),我已经把它搞砸了。 需要在httpd.conf 中创建一个“静态”别名。根据Graham Dumpleton的建议,我还将wsgi.py脚本移动到了自己的文件夹中。所以现在我的结构是

f:\django_web/
   |---MySite
       |---static/
       |   |---admin/
       |       |--css
       |       |--img
       |       |--js  
       |---MyApp/
       |   |--__init__.py
       |   |--admin.py
       |   |--models.py
       |   |--tests.py
       |   |--views.py
       |---MySite/
       |   |--__init.py
       |   |--settings.py
       |   |--testdb.py
       |   |--urls.py
       |---Apache/
       |   |--wsgi.py
       |--manage.py

我的httpd配置包括:

Alias /static "F:/Web_Django/MySite/static/"
<Directory "F:/Web_Django/MySite/static/">
    Order allow,deny
    Options Indexes
    Allow from all
    IndexOptions FancyIndexing
</Directory>

WSGIScriptAlias /MySite F:/Web_Django/MySite/Apache/wsgi.py
WSGIPythonPath F:/Web_Django/MySite
<Directory F:/Web_Django/MySite/Apache/>
Order deny,allow
Allow from all
</Directory>

一切正常!

答案 1 :(得分:1)

只是为了澄清你的答案:你可以将你的文件保存在项目中(用于开发目的),当你需要部署时,你可以使用命令

django-admin.py collectstatic¶

在settings.py&gt;中描述的目录中收集您的文件STATIC_ROOT

其中一个优点是你可以正常使用你的JS和CSS,当它的部署时间你可以使用像压缩(http://django-compressor.readthedocs.org/en/latest/)之类的扩展来缩小并将缩小的发送到静态根(可以在CDN)。

进一步阅读:https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/

修改

在Nginx中你会使用

location /myuser/static/ {                                         # STATIC_URL
    alias /home/myuser/projects/src/MyProject/static/;              # STATIC_ROOT
}

定义STATIC_ROOT的别名。

然后,服务器将知道在哪里查找使用Collect_static创建的文件。

我认为与您相关的是您的服务器不知道在项目中找到文件的位置。使用项目内部服务的文件的其他问题是您失去了模块化。你不能在你的项目中有不同的静态目录(每个模块一个),而不必在你的服务器中创建更多的别名(更杂乱)。

顺便说一句,dev服务器不会发生这种情况。它找到你的文件而无需配置。