Python 我如何让它进入主页?

Python 我如何让它进入主页?,python,django,python-3.x,Python,Django,Python 3.x,我正在使用Django,登录后,我重定向到主页。如果会话中仍然有令牌,我不想转到登录页面。我该怎么做 class LoginPageView(TemplateView): template_name = 'login.html' def get(self, request, *args, **kwargs): if request.session['token']: return redirect(

我正在使用Django,登录后,我重定向到主页。如果会话中仍然有令牌,我不想转到登录页面。我该怎么做

    class LoginPageView(TemplateView):
        template_name = 'login.html'

        def get(self, request, *args, **kwargs):
            if request.session['token']:
                return redirect('login')
            else:
                return redirect('home')
我的网址:

from django.urls import path
from django.conf.urls import url
from . import views

urlpatterns = [
    path('', views.HomePageView.as_view(), name='home'),
    path('login/', views.LoginPageView.as_view(), name='login'),
    url(r'^sign-in/$', views.sign_in, name='sign-in')
]
我写了这样的代码,但不起作用

在/登录时出现密钥错误/ “代币”


有几个问题:

  • 请求。如果没有令牌,会话['token']
    将引发一个
    KeyError
    。这就是你看到的错误。使用
    request.session.get('token')
    ,如果没有
    令牌,则返回
    None
  • 忽略1.,您的逻辑被翻转,当前如果有令牌,它将重定向到
    登录
    ,如果没有令牌,它将重定向到
    主页
  • 将导致重定向循环,用户将永远看不到您的
    login.html
    模板
  • 相反,如果有令牌,则要重定向到
    home
    ,如果没有令牌,则呈现
    login.html
    模板

    class LoginPageView(TemplateView):
        template_name = 'login.html'
    
        def get(self, request, *args, **kwargs):
            if request.session.get('token'):
                return redirect('home')
            return super().get(request, *args, **kwargs)
    
    除了显而易见的缺陷外,代码中还可能存在逻辑缺陷

    • 我没有看到任何令牌验证
    • 如果用户有令牌,他或她将被重定向到/login
    如果request.session中的'token':返回重定向('login')
    views.LoginPageView没有返回HttpResponse对象。它返回的是None。您还需要编写else部分。顺便说一句,可以跳过
    else
    ,但您需要编写第二个
    返回值
    class LoginPageView(TemplateView):
        template_name = 'login.html'
    
        def get(self, request, *args, **kwargs):
            if request.session.get('token'):  # trivial change, makes it safe for KeyError
                return redirect('login')
            else:
                return redirect('home')