Skip to main content

从单个 Django 应用程序服务多个站点

项目描述

https://travis-ci.org/ecometrica/django-multisite.svg?branch=master https://coveralls.io/repos/github/ecometrica/django-multisite/badge.svg?branch=master

自述文件

使用 pip 安装:

pip install django-multisite

或者通过 git 获取代码:

git clone git://github.com/ecometrica/django-multisite.git django-multisite

然后运行:

python setup.py install

或者将 django-multisite/multisite 文件夹添加到您的 PYTHONPATH。

如果您想贡献,请运行:

python setup.py develop

快速开始

将 settings.py 中的 SITE_ID 替换为:

from multisite import SiteID
SITE_ID = SiteID(default=1)

将这些添加到您的 INSTALLED_APPS:

INSTALLED_APPS = [
    ...
    'django.contrib.sites',
    'multisite',
    ...
]

在 OPTIONS 部分添加到您的 settings.py TEMPLATES 加载器:

TEMPLATES = [
    ...
    {
        ...
        'DIRS': {...}
        'OPTIONS': {
            'loaders': (
                'multisite.template.loaders.filesystem.Loader',
                'django.template.loaders.app_directories.Loader',
            )
        }
        ...
    }
    ...
]

编辑 settings.py MIDDLEWARE (MIDDLEWARE_CLASSES for Django < 1.10):

MIDDLEWARE = (
    ...
    'multisite.middleware.DynamicSiteMiddleware',
    ...
)

附加到 settings.py,以便使用可以安全清除的自定义缓存:

# The cache connection to use for django-multisite.
# Default: 'default'
CACHE_MULTISITE_ALIAS = 'multisite'

# The cache key prefix that django-multisite should use.
# If not set, defaults to the KEY_PREFIX used in the defined
# CACHE_MULTISITE_ALIAS or the default cache (empty string if not set)
CACHE_MULTISITE_KEY_PREFIX = ''

如果您已将 CACHE_MULTISITE_ALIAS 设置为自定义值,例如 'multisite',请将单独的后端添加到 settings.py CACHES:

CACHES = {
    'default': {
        ...
    },
    'multisite': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'TIMEOUT': 60 * 60 * 24,  # 24 hours
        ...
    },
}

多站点通过检查所有别名域来确定 ALLOWED_HOSTS。您还可以设置 MULTISITE_EXTRA_HOSTS 以包含其他主机。这可以包括通配符。:

MULTISITE_EXTRA_HOSTS = ['example.com']
# will match the single additional host

MULTISITE_EXTRA_HOSTS = ['.example.com']
# will match any host ending '.example.com'

开发环境

Multisite 在“开发模式”下返回一个有效的别名(默认为与默认 SiteID 关联的别名。

开发模式是:
  • 运行测试,即manage.py test

  • 在settings.DEBUG = True中本地运行,其中hostname为顶级名,即localhost

为了让多站点在本地环境中使用别名,请将条目添加到本地 etc/hosts 文件以匹配应用程序中的别名。例如

127.0.0.1 example.com
127.0.0.1 examplealias.com

并通过 example.com:8000 或 examplealias.com:8000 访问您的应用程序,而不是通常的 localhost:8000。

域后备

默认情况下,如果域名未知,多站点将响应 HTTP 404 Not Found 错误。要更改此行为,请添加到 settings.py:

# The view function or class-based view that django-multisite will
# use when it cannot match the hostname with a Site. This can be
# the name of the function or the function itself.
# Default: None
MULTISITE_FALLBACK = 'django.views.generic.base.RedirectView

# Keyword arguments for the MULTISITE_FALLBACK view.
# Default: {}
MULTISITE_FALLBACK_KWARGS = {'url': 'http://example.com/',
                             'permanent': False}

模板

如果需要,为域级模板创建模板子目录(在 settings.TEMPLATES['DIRS'] 中指定的位置。

Multisite 的模板加载器将在具有域名称的文件夹中查找模板,例如:

templates/example.com

模板加载器还将在由可选的 MULTISITE_DEFAULT_TEMPLATE_DIR 设置指定的文件夹中查找模板,例如:

templates/multisite_templates

跨域cookies

为了支持跨域 cookie,出于单点登录等目的,请将以下内容添加到 settings.py MIDDLEWARE 的顶部(对于 Django < 1.10 的 MIDDLEWARE_CLASSES):

MIDDLEWARE = (
    'multisite.middleware.CookieDomainMiddleware',
    ...
)

CookieDomainMiddleware 将查阅公共后缀列表 以获取有效的顶级域。它将这个文件缓存在系统的默认临时目录中作为Effective_tld_names.dat。要在 settings.py 中更改此设置:

MULTISITE_PUBLIC_SUFFIX_LIST_CACHE = '/path/to/multisite_tld.dat'

默认情况下,任何未设置域的 cookie 都将被重置为允许 *.domain.tld。要在 settings.py 中更改此设置:

MULTISITE_COOKIE_DOMAIN_DEPTH = 1  # Allow only *.subdomain.domain.tld

为了获取列表的新版本,运行:

manage.py update_public_suffix_list

测试

要运行测试:

python setup.py test

或者:

pytest

在部署更改之前,通过运行来验证它没有破坏任何东西:

tox

这会在每个受支持的 Django 和 Python 组合下运行测试。

下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

django-multisite-1.9.0.tar.gz (25.4 kB 查看哈希)

已上传 source

内置分布

django_multisite-1.9.0-py3-none-any.whl (31.1 kB 查看哈希

已上传 py3