除了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>
答案 0 :(得分:1)
您是否设置了Apache以分别在MEDIA_ROOT
和STATIC_ROOT
处设置为MEDIA_URL
和STATIC_URL
的目录?在开发过程中,Django为您提供静态媒体,因此您不需要完整的Web服务器堆栈,但在生产环境中,由您自己来处理文件。
<强>更新强>
只需删除AliasMatch
行即可。如果您已经为/ media /和/ static /设置了Alias
指令,则它们是不必要的。所有静态资源都将位于这两个目录之一。
另外,不要忘记运行python manage.py collectstatic
。否则,指定为STATIC_ROOT
的目录将为空,这显然也会导致404。