我的foo.js在Django runserver中工作但在Apache(wsgi)中我得到404.为什么?

时间:2012-05-16 20:20:25

标签: python django apache url routing

除了url(指向视图,而不是真实文件)之外,每个url在Apache和django runserver中都能正常工作:

foo.js

urls.py:

url(r'^foo.js$', 'myapp.views.foo', name="foo"),

views.py:

def foo(request):
    return HttpResponse("foo")

开发服务器中调用此网址会输出foo

在带有mod_wsgi的 Apache 中,使用相同的网址,我得到404

wsgi conf文件(非常基本):

import os
import sys, logging

sys.stdout = sys.stderr

path = '/var/www/vhosts'
if path not in sys.path:
   sys.path.insert(0, path)
   sys.path.insert(0, path + '/myapp')

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

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

/foo/这样的经典网址按预期工作。

问题出在哪里?这是一种我不知道/认识的apache行为吗?它是Django路由吗?

修改

添加apache conf后(感谢可能有明显的暗示),我认为* .js上的那些AliasMatch是问题..我完全忘记了它们!

<VirtualHost *:80>
        DocumentRoot "/var/www/vhosts/myapp"
        ServerName www.myapp.local


    Alias /robots.txt  /var/www/vhosts/myapp/public/static/robots.txt
    Alias /favicon.ico /var/www/vhosts/myapp/public/static/favicon.ico

    AliasMatch ^/([^/]*\.css) /var/www/vhosts/myapp/public/static/$1
    AliasMatch ^/([^/]*\.js)  /var/www/vhosts/myapp/public/static/$1


    Alias /media/  /var/www/vhosts/myapp/public/media/
    Alias /static/ /var/www/vhosts/myapp/public/static/

    <Directory /var/www/vhosts/myapp>
                Order allow,deny
                Allow from all
        </Directory>

        WSGIDaemonProcess myapp.djangoserver processes=2 threads=15 display-name=%{GROUP}
        WSGIProcessGroup myapp.djangoserver

        WSGIScriptAlias / /var/www/vhosts/myapp/apache/django.wsgi
LogLevel info
</VirtualHost>

1 个答案:

答案 0 :(得分:1)

您是否设置了Apache以分别在MEDIA_ROOTSTATIC_ROOT处设置为MEDIA_URLSTATIC_URL的目录?在开发过程中,Django为您提供静态媒体,因此您不需要完整的Web服务器堆栈,但在生产环境中,由您自己来处理文件。

<强>更新

只需删除AliasMatch行即可。如果您已经为/ media /和/ static /设置了Alias指令,则它们是不必要的。所有静态资源都将位于这两个目录之一。

另外,不要忘记运行python manage.py collectstatic。否则,指定为STATIC_ROOT的目录将为空,这显然也会导致404。