每个 url 在 Apache 和 django runserver 中都可以正常工作,除了 url(指向视图,而不是真实文件(,如下所示:
foo.js
urls.py:
url(r'^foo.js$', 'myapp.views.foo', name="foo"),
views.py:
def foo(request):
return HttpResponse("foo")
在开发服务器中调用此 url 输出我foo
在带有mod_wsgi的 Apache 中,使用相同的 url,我得到了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/
这样的经典网址按预期工作。
问题出在哪里?这是我不知道/不认识的阿帕奇行为吗?是 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>
您是否设置了Apache来分别在MEDIA_URL
和STATIC_URL
上提供设置为MEDIA_ROOT
和STATIC_ROOT
的目录?在开发中,Django 为你提供静态媒体,所以你不需要完整的 Web 服务器堆栈,但在生产中,由你来提供文件。
更新
只需删除AliasMatch
行即可。如果您已经为/media/和/static/设置了Alias
指令,则不需要它们。所有静态资源都将位于这两个目录之一中。
另外,不要忘记运行python manage.py collectstatic
.否则,指定为 STATIC_ROOT
的目录将为空,这显然也会导致 404。