Django 视图链接/重定向最佳实践

Posted

技术标签:

【中文标题】Django 视图链接/重定向最佳实践【英文标题】:Django view chaining/redirecting best practices 【发布时间】:2016-07-17 12:37:50 【问题描述】:

我正在构建一个应用程序,该应用程序从用户可以登录或注册的登录页面开始。我有两种不同类型的用户,他们在成功登录后将被带到两个不同的仪表板页面(我根据他们的凭据知道哪种用户正在登录)。

我的问题是关于处理这种观点的最佳方式。我的登录视图具有告诉我得到哪种用户的逻辑,然后为该用户的仪表板正确呈现模板。但是,我还为每种仪表板提供了一个单独的视图,它以与登录视图相同的方式呈现相同的模板——这是用于当用户单击“主页”按钮或你有什么时。重复这样的逻辑似乎很愚蠢(而且现在每个仪表板都有两个 URL - 'login/' 和 'dashboard_x/'),所以我很好奇让我的登录视图“重定向”到基于收到的登录凭据的正确仪表板视图。理想情况下,它只检查用户类型,然后将请求传递到适当的仪表板视图而不进行修改。

【问题讨论】:

【参考方案1】:

您可以简单地使用快捷方式库中的条件 Django 重定向吗?有文档here 。

类似:

from django.shortcuts import redirect

def my_view(request):
    if something:
        return redirect('something-view')
    elif something_else:
        return redirect('something-else-view')
    else:
        # do something else

当然,您必须根据您使用的视图类型(基于类/基于函数)进行调整。

如果您想使用相同的 url 和视图,也可以使用查询参数执行切换:

def my_view(request):
    if something:
        return redirect('something-view', type='thing')
    elif something_else:
        return redirect('something-view', type='else')
    else:
        # do something else

然后在你的东西视图中测试类型。这当然不是很安全(用户可以更改类型参数),因此您需要再次检查他们在某物视图中的用户类型,以确保他们没有试图查看他们应该看到的版本t.

最后,选项三是将它们重定向到同一个仪表板,它们仅依靠检查仪表板视图中的用户类型来确定向它们显示的内容。这是最安全的选项,因为逻辑保存在服务器上并且不受用户控制:)。这也是视图的一个非常常见的习惯用法,例如,如果当前用户是否存在,许多视图的行为会有所不同。

【讨论】:

以上是关于Django 视图链接/重定向最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

301 重定向最佳实践 - 多个站点到单个站点

最佳实践:301 将 HTTP 重定向到 HTTPS(标准域)

最佳实践:如何跟踪出站链接?

django 设计模式/最佳实践:过滤查询集

Django 查看安全性和最佳实践

Django:URL conf、url 模板标签的最佳实践