如何让apache为django提供静态文件

时间:2012-08-09 11:15:31

标签: django apache2

我使用 mod_python 在我们的 apache2 生产服务器上运行了一个django Web应用程序,但没有找到静态文件(css,images ...)

我们所有的静态内容都在/var/my.site/example/static

之下
/var/my.site/example/static/
                           |-admin/
                                  |-css/
                                  |-img/     
                           |-css/
                           |-js/
                           |-img/

现在我想我可以将所有请求别名化为我的静态内容:

这是apache2 conf:

<VirtualHost  123.123.123:443>
    ... SSL stuff ...
    RewriteEngine On    
    ReWriteOptions Inherit 
    <Location "/example">
        SetHandler python-program
        PythonHandler django.core.handlers.modpython
        SetEnv DJANGO_SETTINGS_MODULE example.settings
        PythonPath "[ \
            '/home/me/Envs/ex/lib/python2.6/site-packages',\
            '/var/my.site',\
            '/home/me/Envs/ex/lib/python2.6/site-packages/django',\
            '/home/me/Envs/ex/lib/python2.6/site-packages/MySQLdb',\
            '/var/my.site/example',\
            '/var/my.site/example/static'] + sys.path"
        PythonDebug Off

    </Location>

    Alias /example/static /var/my.site/example/static    
    <Directory /var/my.site/example/static>
        Order allow,deny
        Allow from all
    </Directory>

</VirtualHost>

这是我的settings.py

...
STATIC_ROOT = '/var/my.site'
STATIC_URL = '/example/static/'
STATICFILES_DIRS = (
    "/var/my.site/example/static",
)
...

apache-error日志中没有错误。但是这里从apache-secure_access.log

登录
[09/Aug/2012:12:37:55 +0200] "GET /example/admin/ HTTP/1.1" 200 6694
[09/Aug/2012:12:37:55 +0200] "GET /example/static/css/base.css HTTP/1.1" 301 468
[09/Aug/2012:12:37:55 +0200] "GET /example/static/img/logo.png HTTP/1.1" 403 766
[09/Aug/2012:12:37:55 +0200] "GET /example/static/css/base.css/ HTTP/1.1" 500 756
[09/Aug/2012:12:37:55 +0200] "GET /example/static/admin/css/dashboard.css HTTP/1.1" 301 622

但是这不起作用,我不确定,如果我甚至是在正确的轨道上。当我设置DEBUG = True时它确实有效但这只是因为django服务于所有静态文件。

我做错了什么?

有没有人知道一个好的教程或示例?

3 个答案:

答案 0 :(得分:2)

尝试逐步消除问题。

加载静态文件应完全独立于Django。尝试在VirtualHost配置中注释掉与Django相关的所有行。 (记得在更改配置后重新加载Apache)

如果可行,可能需要采取更多措施来避免Django践踏同一命名空间中的URL(可能使用SetHandler?)。

如果没有,静态文件存在更基本的问题。如果您无法解决问题,或许ServerFault可以提供帮助吗?

答案 1 :(得分:2)

@supervacuo建议我从django中删除所有内容后,我得到了apache来提供静态文件并意识到出了什么问题。

问题是<Location "/example">优先于Alias /example/static。我放Alias的位置(<Location> - tag上方或下方)并不重要。

要解决此问题,我更改了STATIC_URLSTATIC_ROOT,而不是更改Alias而不是干扰<Location> - tag

发件人:

STATIC_ROOT = '/var/my.site'
STATIC_URL = '/example/static/'

Alias /example/static /var/my.site/example/static

STATIC_ROOT = '/var/my.site/example'
STATIC_URL = '/static/'

Alias /static /var/my.site/example/static   

答案 2 :(得分:0)

我能看到的唯一问题是:

"GET /example/static/css/base.css/ HTTP/1.1" 500 756

由于/base.css/不是有效链接;它被传递给django;并且由于它与URL模式不匹配,因此它会引发500.您应该修复具有错误/的模板。