Webfaction apache + mod_wsgi + django配置问题

时间:2010-04-28 12:29:41

标签: python django url production-environment

我最近偶然发现了一个问题,即使我解决了这个问题,我也想听听你对正确/简单/采用的解决方案的看法。

我正在使用Django + python开发网站。当我在本地机器上使用“python manage.py runserver”运行它时,默认情况下本地地址为http://127.0.0.1:8000/

但是,在生产服务器上,我的应用程序有其他网址,路径为“http://server.name/myproj/

我需要生成并使用永久网址。如果我正在使用{%url view params%},我将获得相对于/的路径,因为我的urls.py包含此

urlpatterns = patterns('',
 (r'^(\d+)?$', 'myproj.myapp.views.index'),
 (r'^img/(.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT + '/img' }),
 (r'^css/(.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT + '/css' }),
)

到目前为止,我看到了两个解决方案:

  1. 修改urls.py,在生产运行时包含'/ myproj /'
  2. 使用request.build_absolute_uri()在views.py中创建链接或使用模板中的'hostname:port / path'传递一些变量
  3. 有更好的方法来解决这个问题吗?谢谢。

    更新:好吧,问题似乎不是在django中,而是以webfaction方式配置wsgi。具有URL“hostname.com/myapp”的应用程序的Apache配置包含以下行

    WSGIScriptAlias / /home/dreamiurg/webapps/pinfont/myproject.wsgi
    

    所以,SCRIPT_NAME是空的,我看到的唯一解决方案是从mod获取mod_python或从root服务我的应用程序。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

你不需要做任何特别的事情。 Django尊重mod_wsgi设置的SCRIPT_NAME环境变量,当您提供除根之外的Django站点时,并将其自动添加到url反向代码。

如果你正在使用mod_python(你不应该),你可能需要在Apache配置中设置django.root

更新我怀疑这是由于Webfaction通过Apache的代理实例为Django站点提供服务的方式 - 该实例不知道Webfaction控制面板确定的实际挂载点。

在这种情况下,您可能需要在SCRIPT_NAME脚本中手动设置.wsgi。我认为这应该有效:

_application = django.core.handlers.wsgi.WSGIHandler()

def application(environ, start_response):
    os.environ['SCRIPT_NAME'] = '/myproj/'
    return _application(environ, start_response)

答案 1 :(得分:2)

变化:

WSGIScriptAlias / /home/dreamiurg/webapps/pinfont/myproject.wsgi

为:

WSGIScriptAlias /myproj /home/dreamiurg/webapps/pinfont/myproject.wsgi

然后将WebFaction的nginx前端配置更改为代理到后端的'/ myproj',而不是'/'。

这应该是所有必需的。你不应该在urls.py中使用'/ myproj'前缀。

换句话说,只需确保后端的安装点与安装在前端的安装点相同。

修改WSGI脚本文件以捏造SCRIPT_NAME,尽管它可能有效,但通常不建议不要让Apache / mod_wsgi做正确的事情,这可能会产生其他影响。