【问题标题】:Django generic authentication in views视图中的 Django 通用身份验证
【发布时间】:2017-04-17 18:47:08
【问题描述】:

如何避免在每个视图函数中都有这段代码:

if request.user.is_authenticated():

    return HttpResponse("OK")
else:

    return HttpResponse("Load_Login_Form")

而是每次/在“调用” url/view 之前执行它?

【问题讨论】:

  • @login_required 不适合您?

标签: javascript python django django-views


【解决方案1】:

如果用户尚未登录,我将使用自定义方法装饰器返回您的登录响应。像这样:

# decorators.py
from django.http import HttpResponse


def check_login(view):
    def wrap(request, *args, **kwargs):
        if not request.user.is_authenticated():
            return HTTPResponse("Load_Login_Form")
        return view(request, *args, **kwargs)
    return wrap

然后您只需将其导入您的视图文件并将其添加到您要保护的每个视图之前

# views.py
from django.http import HttpResponse
from .decorators import check_login


@check_login
def ok_view(request):
    return HttpResponse("OK")

【讨论】:

  • 但是在这种情况下,如果没有登录,如何向服务器发送响应?我的整个 Web 应用程序是动态的,没有 url 重定向
  • 啊,你可能想创建自己的装饰器。我将编辑我的帖子以反映这一点。
  • @Brobin 你能解释一下为什么我们需要在这里重新发明轮子而不是仅仅使用@login_required吗?
  • @Mojimi 正在开发一个单页应用程序,使用每个视图仅在响应中从服务器获取数据。如果我们使用login_required,它将重定向到登录页面,而不是向他提供他需要在他的端呈现表单的响应。它很简单,所以自定义装饰器就是解决方案。
  • @ettanany 下面对解决方案的评论更详细地解释了 Mojimi 正在寻找的内容。
【解决方案2】:

authentication package 提供了装饰器和混入来支持这一点。如果您想为未经身份验证的用户重定向到登录页面,装饰器很容易使用,如果您想做其他事情但需要使用基于类的视图,则 mixin 会更加灵活。

如果您想将此行为应用于您的整个网站,而不是在需要登录的视图中进行装饰或继承,(假设对于某些列入白名单的页面(例如登录)除外)有一些中间件示例可以支持该功能这个老问题: Django: How can I apply the login_required decorator to my entire site (excluding static media)?

【讨论】:

  • 我猜我将不得不切换到类视图?由于我的 Web 应用程序不会将客户端重定向到任何 url,而是使用 AJAX 和 javascript/jquery 动态更改页面
猜你喜欢
  • 2011-10-01
  • 2018-06-02
  • 2020-08-27
  • 2019-12-30
  • 1970-01-01
  • 2018-06-12
  • 2021-07-23
  • 1970-01-01
  • 2021-06-25
相关资源
最近更新 更多