Динамически обслуживать статический контент на основе имени сервера в Django - PullRequest
1 голос
/ 14 сентября 2011

Я пишу веб-приложение на Django, доступ к которому осуществляется с нескольких доменов на один и тот же IP-адрес.Идея состоит в том, что каждый домен, к которому осуществляется доступ к приложению, получит уникальный бренд.

Так, например, если бы было два домена, reseller.com и oem.com, и вы перешли на oem.com, этоперенести вас на тот же веб-сайт, что и reseller.com, но с другим тематическим контентом (скажем, отправленным с /static/oem.com/ndomfiles} вместо /static/reseller.com/ndomfiles coming).

По сути, моя идея заключалась в том, чтобы определить пользовательский тег шаблона, который получает SERVER_NAME в качестве аргумента, который будет возвращать местоположение содержимого.

Есть ли альтернативы или просто более простые варианты?

Редактировать: Я, вероятно, должен добавить, что я использую MongoDB для этого проекта, и поэтому вполне вероятно, что ORM Django не будет использоваться для проекта.

Редактировать еще раз: Дополнительные пояснения;Я использую nginx.

Ответы [ 3 ]

1 голос
/ 14 сентября 2011

Не уверен, как сделать простое правило перезаписи в nginx.Помимо тега шаблона (если вы заменяете только статический контент, то я думаю, что тег шаблона - это то, что нужно), если сайты будут вообще отличаться от шаблона, вы можете справиться с этим, написав пользовательскийзагрузчик шаблонов.

Это позволяет вам выбрать, какие шаблоны вы хотели бы использовать при отображении вашей страницы.Этот метод имеет изящный способ сбой, если загрузчик не может найти соответствующий шаблон для вашего конкретного домена.Если он не найдет совпадения, он вернется к вашему основному каталогу шаблонов.Таким образом, вы можете иметь пользовательские вещи для некоторых доменов и более общие для других.

Но чтобы принять решение о том, что обслуживать, основываясь на заголовке запроса, вам нужно сделать запрос доступным для загрузчика через _thread_localsЯ делаю это в некотором промежуточном программном обеспечении:

#custom.middleware.py
try:
    from threading import local
except ImportError:
    from django.utils._threading_local import local

_thread_locals = local()

def get_current_request():
    return getattr(_thread_locals, 'request', None)

class RequestMiddleware():
    def process_request(self, request):
        _thread_locals.request = request

Затем напишите загрузчик шаблонов (обновите путь к промежуточному программному обеспечению):

#custom.loaders.py
from os.path import join
from django.conf import settings
from django.template import TemplateDoesNotExist
from path.to.middleware import get_current_request

def load_template_source(template_name, template_dirs=None):
    request = get_current_request()
    host = request.get_host()
    path_to_template_dir = None
    for site in settings.SITE_TEMPLATE_FOLDERS:
        if site[0] == host:
            path_to_template_dir = site[1]
            break

    if path_to_template_dir:
        try:
            filepath = join(path_to_template_dir, template_name)
            file = open(filepath)
            try:
                return (file.read(), filepath)
            finally:
                file.close()
        except IOError:
                pass

    raise TemplateDoesNotExist(template_name)

и, наконец, обновите файл настроек с помощью трех вещей 1) добавить загрузчик шаблонов (сначала убедитесь, что он указан в списке) 2) добавить промежуточное программное обеспечение 3), а затем добавить новую переменную SITE_TEMPLATE_FOLDERS с кортежем кортежей, содержащих домены и пути к папкам шаблонов:

#settings.py

.....

TEMPLATE_LOADERS = (
    'custom.loaders.load_template_source',
    'django.template.loaders.filesystem.load_template_source',
    'django.template.loaders.app_directories.load_template_source',
)

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'domain.middleware.SessionMiddleware',
    'custom.middleware.RequestMiddleware',
)

SITE_TEMPLATE_FOLDERS = (
    ('mydomain.com', '/path/to/templates'),
    ('myotherdomain.com', '/path/to/other/templates')
)
...

Похожемного, но теперь вы можете легко добавить новый домен через ваш файл настроек.

1 голос
/ 14 сентября 2011
0 голосов
/ 14 сентября 2011

Например, в Apache есть mod_rewrite, который вы можете использовать для перезаписи URL: RewriteCond %{HTTP_REFERER} ^www.domain1.com$ [NC] RewriteRule /static/[^/]+ /static/domain1/$1 [L] RewriteCond %{HTTP_REFERER} ^www.domain2.com$ [NC] RewriteRule /static/[^/]+ /static/domain2/$1 [L] (это не проверено)

другие серверы также имеют аналогичную функциональность.

Просто убедитесь, что ваше приложение django генерирует статические URL, которые не зависят от сайта и могут быть корректно переписаны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...