【问题标题】:Accessing a Django Web App Through Two Separate Domains通过两个单独的域访问 Django Web 应用程序
【发布时间】:2012-09-20 14:48:16
【问题描述】:

如何最好地将 Django Web 应用程序托管在同一台服务器上但用于两个不同的域?

我有一个使用 Apache+mod_wsgi 部署的 Django Web 应用程序,我想通过两个单独的域(例如 wwww.mydomain.com 和 www.otherdomain.com)访问它。两个域共享相同的数据库和用户帐户,但具有特定于域的功能(主要是美观,显示不同的模板、图形、一些额外的工具等)。

每个域也有自己的 SSL 证书。用户也可能在域之间被反弹(例如,他们从 mydomain.com 开始,然后“启用”将他们带到 otherdomain.com 的功能)。

起初我以为我所要做的就是将域附加到我的 Apache conf 文件中的 ServerAlias 指令中。例如ServerAlias *mydomain.com *otherdomain.com。但是,我遇到了一些问题。

  1. 如果我正确阅读this,单个 Apache 部分只能支持 一个 域的证书(不包括子域的通配符证书),因此为了支持 HTTPS我需要复制我的两个域,为第二个域交换不同的证书信息。

  2. 为了正确跟踪 cookie,我需要将 SESSION_COOKIE_DOMAINCSRF_COOKIE_DOMAIN 设置为正在使用的域。但是,每个 settings.py 只能执行一次,所以概述了here,我需要创建重复的 settings.py 文件(例如 settings_mydomain.py 和 settings_otherdomain.py)以及重复的 django.wsgi 文件,每个文件都使用适当的设置模块。

  3. 使用默认设置,如果用户从一个域跳到另一个域,他们将丢失所有 cookie,导致他们在登录后被注销。我不确定如何最好解决这个问题。由于用户被 Django 视图重定向,起初我想我可以复制 cookie,将旧域换成新域。另一个想法是将 cookie 复制到数据库表中,使用一次性查找哈希进行索引(例如,与 Django 进行注册确认的方式相同),并将此哈希包含在重定向中,然后应用程序将使用该哈希来查找 cookie 和将它们设置在客户端中。这些都行吗?

这三个问题有没有更好的解决方案?还有其他我忽略的问题或问题吗?

【问题讨论】:

  • 你在使用 Django sites吗?
  • 好问题。使用sites 和单独的设置文件,我认为您走在正确的轨道上,并且您最后提出的会话解决方案听起来是可行的。我不建议移动这篇文章,但 serverfault.com 上的一个类似问题可能会得到回报。
  • @YuvalAdam, django.contrib.sites?是的。

标签: python django apache cross-domain


【解决方案1】:

快速解决方法是使用多个 Apache Virtual Host 块,例如

<VirtualHost ´your server IP here´:´server port´>
  ServerName mydomain.com
  WSGIDaemonProcess mydomain display-name=mydomain
  WSGIProcessGroup mydomain
  WSGIScriptAlias / /path/to/your/django/project/wsgi.py
  Alias /static /path/to/your/django/project/static/
</VirtualHost>

<VirtualHost ´your server IP here´:´server port´>
  ServerName otherdomain.com
  WSGIDaemonProcess otherdomain display-name=otherdomain
  WSGIProcessGroup otherdomain
  WSGIScriptAlias / /path/to/same/django/project/as/above/wsgi.py
  Alias /static /path/to/your/django/project/static/
</VirtualHost>

然后使用来自HttpRequest.METASERVER_NAME 的值作为模板文件夹中的文件夹分隔符,并在请求模板时使用,例如

def my_server_sensitive_view(request):
  return render_to_response('%(SERVER_NAME)s/index.html' % request.META, 
    {"foo": "bar"})

如果您需要在两个站点之间分离内容,但仍需要在它们之间交叉发布,那么使用django.contrib.sites 您将能够设置多个域。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    相关资源
    最近更新 更多