【问题标题】:Run a Django QuerySet when user authenticated用户通过身份验证时运行 Django QuerySet
【发布时间】:2018-09-05 11:10:03
【问题描述】:

我正在寻找以下问题的解决方案:

我有一个包含多种查询集和 python 代码的主函数。在此功能中,有许多查询必须仅在用户经过身份验证时才运行。我知道当我在函数之前使用@login_required 时,我可以对用户进行身份验证,但是如何在函数内部使用身份验证?

我的示例代码:

def auth(request):

    username = request.POST['username']
    password = request.POST['password']

    user = authenticate(request, username=username, password=password)
    if user is not None:
        login(request, user)
        return render(request, 'project/index.html')

    else:

        login(request, user)

def dashboard_data(request):

       qs1 = MyModel.objects.all()
       qs2 = MyModel.objects.all()
       qs3 = MyModel.objects.all()

        #Lets say I want to run the the following queries when user logged in
       qs_logged1 = MyModel.objects.all()
       qs_logged2 = MyModel.objects.all()

       send_data = {
          'qs1': qs1,
          'qs2': qs2,
          'qs3': qs3,
          'qs_logged1':qs_logged1,
          'qs_logged2':qs_logged2
                   }

     return render(request, 'project/index.html', send_data)

我怎样才能只在用户登录时运行上面的查询?

【问题讨论】:

    标签: python django authentication django-authentication


    【解决方案1】:
    def dashboard_data(request):
        qs1 = MyModel.objects.all()
        qs2 = MyModel.objects.all()
        qs3 = MyModel.objects.all()
    
        if request.user.is_authenticated:
            qs_logged1 = MyModel.objects.all()
            qs_logged2 = MyModel.objects.all()
    
            send_data = {
                'qs1': qs1,
                'qs2': qs2,
                'qs3': qs3,
                'qs_logged1': qs_logged1,
                'qs_logged2': qs_logged2
            }
    
            return render(request, 'project/index.html', send_data)
        else:
            send_data = {
                'qs1': qs1,
                'qs2': qs2,
                'qs3': qs3,
            }
            return render(request, 'project/index.html', send_data)
    

    【讨论】:

    • 为什么有两个不同的 send_data 定义和两个不同的渲染调用???
    • 你的回答对我帮助很大,我没有使用两次send_data,在else之后我定义了空变量(例如qs_logged1=[]),之后函数运行了正确。
    【解决方案2】:

    您可以使用is_authenticated检查用户是否登录

    def dashboard_data(request):
        if request.user.is_authenticated:
            # do something with authenticated user
        else:
            # do something without authenticated user
        return something
    

    也可以参考this SO post

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-18
      • 2015-11-08
      • 1970-01-01
      • 2016-04-16
      • 2012-11-23
      相关资源
      最近更新 更多