2

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

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

但是,在生产服务器上,我的应用程序有其他 url,带有路径 - 例如“ 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' }),
)

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

  1. 修改 urls.py,在生产运行的情况下包括“/myproj/”
  2. 用于request.build_absolute_uri()在views.py中创建链接或在模板中传递一些带有“主机名:端口/路径”的变量

有没有更漂亮的方法来处理这个问题?谢谢你。

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

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

因此,SCRIPT_NAME 是空的,我看到的唯一解决方案是访问 mod_python 或从根目录提供我的应用程序。有任何想法吗?

4

2 回答 2

3

你不应该做任何特别的事情。当您从根目录以外的位置提供 Django 站点时, Django 尊重SCRIPT_NAME由 mod_wsgi 设置的环境变量,并自动将其添加到 url 反转代码中。

如果您使用的是 mod_python(您不应该使用),您可能需要django.root在 Apache 配置中进行设置。

更新我怀疑这是由于 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)
于 2010-04-28T12:43:49.513 回答
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 做正确的事情,这可能有其他含义。

于 2010-04-29T01:11:05.013 回答