Структура сайтов Django, создающая первичную и подчиненную логику для чувствительных URL

У меня есть два веб-приложения Django, которые используют одну и ту же базу данных и модули, моя проблема в том, что я хочу, чтобы один из веб-сайтов работал в качестве основного сайта "А" (например, для безопасной аутентификации, поскольку только сайт А будет работать по схеме https, помните ваш "B" находится в поддомене "A", поэтому никаких реальных междоменных проблем не возникает, поскольку я делю секретный ключ между файлами настроек).

До сих пор я настроил инфраструктуру сайтов Django, поэтому мой основной сайт "А" снабжен своими собственными настройками и модулем URL, как и мой вторичный (подчиненный) сайт "В".

Теперь, как бы я продолжил реализовывать способ прокси-прокси URL-адресов из "B", который требует https, не повторяя себя снова и снова, учтите, что я использую шаблоны i18n.

Так что в основном мне нужен способ, чтобы мои приложения могли сказать, что URL "логина" в urls_site_b должен прокси для входа в систему urls_site_a, затем вернитесь к сайту B после успеха (например, используя следующий параметр).

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

Также в моих шаблонах (которые также доступны) я бы использовал {% url %} тег, это может быть проблемой, так как тег не может разрешить правильный URL-адрес, поскольку он выглядит только в модуле URL-адресов, который принадлежит текущему сайту.

1 ответ

Решение

Я думаю, что вы думаете слишком сложным, простой декоратор должен сделать свое дело (не проверено):

def proxy(view):
    @wraps(view)
    def wrapper(request, *args, **kwargs):
        current_site = get_current_site(request)
        try:
            main_site = Site.objects.get(id=1).domain  # or set this hard
        except Site.DoesNotExist:
            raise Http404
        if current_site != main_site:
            return HttpResponseRedirect('http://{0}{1}?next=http://{2}/'.format(
                main_site, request.path, current_site)
            )
        return view(request, *args, **kwargs)
    return wrapper

urls_site_b.py

urlpatterns = patterns('',
    url(r'^foo/$', proxy(bar), name='bar'),
)

Теперь убедитесь, что urls_site_a.py также имеет этот шаблон (очевидно, вам не нужно будет украшать представление там).

Другие вопросы по тегам