【问题标题】:Webfaction apache + mod_wsgi + django configuration issueWebfaction apache + mod_wsgi + django 配置问题
【发布时间】:2011-02-13 08:03:05
【问题描述】:

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

我正在使用 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 中创建链接或在模板中使用'hostname:port/path' 传递一些变量

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

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

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

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

【问题讨论】:

    标签: python django url production-environment


    【解决方案1】:

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

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

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

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

    _application = django.core.handlers.wsgi.WSGIHandler()
    
    def application(environ, start_response):
        os.environ['SCRIPT_NAME'] = '/myproj/'
        return _application(environ, start_response)
    

    【讨论】:

    • 嗯,它没有 - 至少没有网络派系托管。我正在使用 mod_wsgi 并给出上面的 urlpatterns,以下代码“来自 django.core.urlresolvers 导入反向永久链接 = reverse('myproj.myapp.views.index')”将返回“/”。除此之外,{% url pinfont.label.views.index %} 将给出相同的路径“/”。
    • 谢谢,我自己设法找到了问题的原因,但您确实帮助了 .wsgi 解决方案。小修复 - 请在第 4 行将“os.environ”更改为“environ”。
    【解决方案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 做正确的事情,这可能会产生其他影响。

    【讨论】:

    • 谢谢,我也试试这个
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多