【问题标题】:My foo.js works in Django runserver but in Apache (wsgi) i get 404. Why?我的 foo.js 在 Django runserver 中工作,但在 Apache (wsgi) 中我得到 404。为什么?
【发布时间】:2012-05-24 11:04:57
【问题描述】:

每个 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/ 等经典网址按预期工作。

问题出在哪里?这是我不知道/不认识的 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>

【问题讨论】:

  • Apache conf 是什么样的?
  • 我忘记了 vhost conf 不是那么“标准”.. 谢谢。

标签: python django apache url routing


【解决方案1】:

您是否将 Apache 设置为分别在 MEDIA_URLSTATIC_URL 处为设置为 MEDIA_ROOTSTATIC_ROOT 的目录提供服务?在开发中,Django 为您提供静态媒体,因此您不需要完整的网络服务器堆栈,但在生产中,由您来提供文件。

更新

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 2014-11-08
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    相关资源
    最近更新 更多