Структура сайтов 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 также имеет этот шаблон (очевидно, вам не нужно будет украшать представление там).