【问题标题】:Multiple Sites under single Django project单个 Django 项目下的多个站点
【发布时间】:2011-03-23 02:53:06
【问题描述】:

在单个 django 项目下有多个站点是否可能且正确。这样将有全局共享的坐文件,urls 文件以及所有站点的全局共享“应用程序”,以及单个 django 项目下所有站点的通用管理界面。每个站点都可能有自己的设置、url 和模板,它们将被覆盖或动态导入到父设置文件中。

谁能告诉我如何使用 Python2.6 + Django 1.2.1 + Apache2.2 + mod_wsgi 来实现这一点。由于我对使用 mod_wsgi 时需要提供虚拟主机有点困惑。

根据上述要求,我计划将 wsgi 文件保留在主 django 项目目录中,以便导入主要设置,并且在主要设置中我计划动态导入请求的站点设置。这可能吗使用 Apache + mod_wsgi 的方式。请指教。

我必须创建一个全局共享模块,而不是全局 django 项目,用于将全局设置和 url 详细信息导入站点特定设置和 url。

我希望更好地重用代码,而不是在每个站点中进行冗余更改。

请指教。

【问题讨论】:

    标签: django


    【解决方案1】:

    以下内容与我的做法相同。我从http://michal.karzynski.pl/blog/2010/10/19/run-multiple-websites-one-django-project/借来的

    基本上,您将在 http.conf 文件中为每个域创建一个虚拟主机条目。

    # Virtual hosts setup
    NameVirtualHost *
    <VirtualHost *>
        ServerName example1.com
    
        WSGIDaemonProcess APPLICATION_NAME processes=5 python-path=/home/USERNAME/webapps/APPLICATION_NAME:/home/USERNAME/webapps/APPLICATION_NAME/lib/python2.6 threads=1
        WSGIScriptAlias / /home/USERNAME/webapps/APPLICATION_NAME/domain1.wsgi
    </VirtualHost>
    
    <VirtualHost *>
        ServerName example2.com
    
    
        WSGIDaemonProcess APPLICATION_NAME_www processes=5 python-path=/home/USERNAME/webapps/APPLICATION_NAME:/home/USERNAME/webapps/APPLICATION_NAME/lib/python2.6 threads=1
        WSGIScriptAlias / /home/USERNAME/webapps/APPLICATION_NAME/domain2.wsgi
    </VirtualHost>
    

    然后,您需要为每个域创建两个不同的 wsgi 文件,并将它们放在包含您的项目的目录中。 WSGIScriptAlias 是 wsgi 文件的路径,所以请确保它们相同...

    示例 Wsgi 文件:

    import os
    import sys
    from django.core.handlers.wsgi import WSGIHandler
    
    os.environ['DJANGO_SETTINGS_MODULE'] = 'PROJECT_NAME.domain1_settings' # or PROJECT_NAME.domain2_settings
    application = WSGIHandler()
    

    然后你会想要创建两个额外的设置文件......所以你会有

    settings.py
    domain1_settings.py
    domain2_settings.py
    

    domain1_settings.py 和 domain2_settings.py 将导入 settings.py:

    domain1_settings.py 示例:

    from settings import *
    
    SITE_ID = 1
    
    ROOT_URLCONF = 'domain1_urls'
    
    INSTALLED_APPS = (
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.sites',
        'django.contrib.messages',
    
    # other apps specific to this domain
    )
    

    最后,您需要创建两个单独的 urls 文件..

    domain1_urls.py 和 domain2_urls.py

    domain1_urls.py 将是 site_id 1 的默认值,domain2_urls.py 将是 site_id 2 的默认值。

    【讨论】:

      【解决方案2】:

      是的,这是完全可能的。这些网站甚至可以共享数据。

      sites 框架实现了这一点 - 有关文档,请参见此处:

      https://docs.djangoproject.com/en/1.11/ref/contrib/sites/

      【讨论】:

      • 您好 Andrew,谢谢,但您能否解释一下如何使用 mod_wsgi 为每个站点创建 apache 虚拟主机,以及如何使用 mod_wsgi 动态处理请求并将其传递到各自的站点。不是每个网站都有自己的设置和网址吗?请指教
      • 我还没有这样做,但我希望您会为每个站点定义一个虚拟主机,配置为全部使用相同的 django 项目。然后在应用程序中,我想你会使用Site.objects.get_current() 来选择例如各个站点的模板目录等。
      • 您能否解释一下我们如何为所有站点配置虚拟站点以配置为使用同一个 django 项目。我在那个部分真的很困惑。请指教
      • 如果您可以在 apache 中设置两个或多个虚拟主机(对此有很好的文档)并为它们提供相同的 WSGI 设置,那可以吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-15
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      • 2015-01-25
      • 1970-01-01
      相关资源
      最近更新 更多