0

我有两个使用相同数据库和模块的 Django Web 应用程序,我的问题是,我希望其中一个网站充当主站点“A”(例如,用于安全身份验证,因为只有站点 A 将在 https 方案下,请注意您的“B”在“A”的子域下,因此不涉及真正的跨域问题,因为我在设置文件之间共享密钥)。

到目前为止,我已经设置了 Django 站点框架,因此我的主“A”站点配备了自己的设置和 urls 模块,我的辅助(从)站点“B”也是如此。

现在我将如何继续实现一种从“B”代理需要 https 的 url 的方法,而不是一遍又一遍地重复我自己,请注意我使用 i18n 模式。

所以基本上我需要一种方法让我的应用程序告诉我的“登录”网址urls_site_b应该代理到“登录”中urls_site_a,然后在成功后返回站点 B(例如使用下一个参数)。

我正在考虑代理中间件,但这并不能解决识别应该链接哪些网址的部分。我想到了一个常量设置,它包含一个应该被代理的 url 列表。然而,这样的编程需要一些时间,我宁愿在继续之前有一些建议。

同样在我的模板(也是共享的)中,我会使用{% url %}标签,这可能是一个问题,因为标签无法解析正确的 url,因为它只在属于当前站点的 urls 模块中查找。

4

1 回答 1

2

我认为您的想法过于复杂,一个简单的装饰器应该可以解决问题(未经测试):

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也有这种模式(显然你不需要在那里装饰视图)。

于 2013-07-03T11:39:44.187 回答