首页 > 编程问答 >用户登录后从个人资料和注销链接错误重定向到登录页面

用户登录后从个人资料和注销链接错误重定向到登录页面

时间:2024-07-25 04:16:22浏览次数:12  
标签:python django django-views

上下文

我正在开发一个 Django 项目,在该项目中我使用配置文件和注销功能实现了用户身份验证。我遇到的问题是,当我尝试从导航栏访问个人资料或注销链接时,它会将我重定向到登录页面,而不是导航到用户的个人资料或执行注销。

个人资料链接

应该导航如果用户已登录,则转到用户的个人资料页面。

注销链接

应注销用户并重定向到主页。

当前设置 - 模板 ( base.html ):

{% if logged_in %}
    <a class="nav-link dropdown-toggle" href="#" id="userDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
        {{ customer_name }}
    </a>
    <ul class="dropdown-menu" aria-labelledby="userDropdown">
        <li><a class="dropdown-item" href="{% url 'profile' %}?email={{ customer_email }}">Profile</a></li>
        <li><a class="dropdown-item" href="{% url 'logout' %}">Logout</a></li>
    </ul>
{% else %}
    <a class="nav-link" href="{% url 'login' %}">Login</a>
{% endif %}

视图:| ||URL:

from django.shortcuts import redirect, render
from django.contrib.auth import authenticate, login as auth_login, logout as auth_logout
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from .models import customer

@login_required
def profile_view(request):
    email = request.GET.get('email')
    if email:
        try:
            user = customer.objects.get(email=email)
            if user.id == request.session.get('customer_id'):
                return render(request, 'profile.html', {'user': user})
            else:
                return redirect('index')
        except customer.DoesNotExist:
            return redirect('index')
    else:
        return redirect('index')

def logout_view(request):
    request.session.flush()
    auth_logout(request)
    return redirect('index')

def login_view(request):
    if request.method == 'POST':
        email = request.POST.get('email')
        password = request.POST.get('password')

        try:
            customer = customer.objects.get(email=email)
            if customer.check_password(password):
                request.session['customer_id'] = customer.id
                request.session['logged_in'] = True
                request.session['customer_name'] = f"{customer.first_name} {customer.last_name}"
                request.session['customer_email'] = customer.email
                messages.success(request, "Logged in!!")
                return redirect('index')
            else:
                messages.error(request, 'Incorrect password')
        except customer.DoesNotExist:
            messages.error(request, 'Email not found')

    return render(request, 'login.html')

会话管理:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('login/', views.login_view, name='login'),
    path('logout/', views.logout_view, name='logout'),
    path('profile/', views.profile_view, name='profile'),
]

会话变量在

  • 中设置并在 login_view 中清除。 logout_view 采取的调试步骤

在不同视图中打印会话数据以确认

  • customer_id 设置正确。 customer_name 观察到单击个人资料或注销链接总是重定向到登录页面。
  • 问题

您能帮我找出为什么这些链接重定向到登录页面而不是显示个人资料或正确注销?具体来说,我需要帮助验证会话处理并确保正确的重定向。

Could you help me figure out why these links are redirecting to the login page instead of showing the profile or logging out properly? Specifically, I need assistance verifying session handling and ensuring correct redirection.


问题出在登录视图中设置会话变量的方式上。正在使用 request.session['customer_id'] = customer.id 等,但这并不安全,可能会导致 Django 错误地处理会话。

为了解决此问题,应该使用 Django 内置的 login() 函数来设置会话。

以下是修改后的代码:

views.py

from django.shortcuts import redirect, render
from django.contrib.auth import authenticate, login, logout
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from .models import Customer

@login_required
def profile_view(request):
    return render(request, 'profile.html')

def logout_view(request):
    logout(request)
    return redirect('index')

def login_view(request):
    if request.method == 'POST':
        email = request.POST.get('email')
        password = request.POST.get('password')

        try:
            customer = Customer.objects.get(email=email)
            if customer.check_password(password):
                # 使用 Django 内置的 login 函数
                login(request, customer)

                messages.success(request, "Logged in!!")
                return redirect('index')
            else:
                messages.error(request, 'Incorrect password')
        except Customer.DoesNotExist:
            messages.error(request, 'Email not found')

    return render(request, 'login.html')

base.html

{% if user.is_authenticated %}
    <a class="nav-link dropdown-toggle" href="#" id="userDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
        {{ user.get_full_name }}
    </a>
    <ul class="dropdown-menu" aria-labelledby="userDropdown">
        <li><a class="dropdown-item" href="{% url 'profile' %}">Profile</a></li>
        <li><a class="dropdown-item" href="{% url 'logout' %}">Logout</a></li>
    </ul>
{% else %}
    <a class="nav-link" href="{% url 'login' %}">Login</a>
{% endif %}

解释:

  1. 使用 login(request, customer) 我们使用 Django 的 login() 函数将用户登录。这将自动设置必要的会话变量。
  2. 使用 user.is_authenticated 在模板中,我们使用 user.is_authenticated 来检查用户是否已登录。
  3. 使用 user.get_full_name 使用 user.get_full_name 来显示用户的全名。
  4. 删除不必要的会话变量: 我们不再需要手动设置 customer_id logged_in customer_name customer_email 等会话变量,因为 Django 会自动处理它们。

通过这些更改,的登录、注销和个人资料链接应该可以正常工作了。

标签:python,django,django-views
From: 78789904

相关文章

  • a method to make some handy tools with python
    Inmyworkingofcomputer,therearealotofsimplejobsthatarefrequentlyrepeated.Itriedtofindawaytomakethesejobbeenprocessedeasily.Method1:Themethodiswritingascripttodothejob,andexecutingthescriptbyutoolsextensionuto......
  • Python网络爬虫详解:实战豆瓣电影信息采集
    文章目录前言一、爬虫是什么?二、常用库及其作用1.Requests2.BeautifulSoup3.lxml4.Scrapy5.Selenium6.PyQuery7.Pandas8.JSON9.Time三、实现步骤步骤一:环境准备步骤二:数据采集步骤三:数据处理步骤四:数据存储总结前言随着互联网的迅猛发展和数据分析需求的不......
  • python学习之内置函数
    Python拥有许多内置函数,这些函数是Python的一部分,不需要额外导入即可直接使用。这些函数提供了对Python解释器功能的直接访问,涵盖了从数学计算到类型检查、从内存管理到异常处理等各个方面。下面是一些常用的Python内置函数及其简要说明:一、Printprint函数大家都不会......
  • Django 表单常用字段参数
    DjangoForm表单,常用表单字段-CSDN博客        在Django中,表单(Form)是用来处理HTML表单数据的重要工具。Django的表单API允许你定义表单字段及其验证规则。每个表单字段都可以通过多种参数来定制其行为。以下是一些常用的表单字段参数:label:字段的标签,用于在HTML表单......
  • Python中以函数为作用域
    点击查看代码#第一题foriteminrange(10):#不报错,没有函数,所有操作在全局作用域里面执行,item最后赋值为:9,此时item在缩进与全局都可以使用passprint(item)#第二题item=10deffunc():foriteminrange(10):#优先在本地查找,找不到在到全局查找p......
  • 掌握IPython宏:%%macro命令的高效使用指南
    掌握IPython宏:%%macro命令的高效使用指南在编程中,宏是一种允许你定义可重用代码片段的强大工具。IPython,这个增强版的Python交互式环境,提供了一个名为%%macro的魔术命令,允许用户创建宏,从而提高代码的可重用性和效率。本文将详细介绍如何在IPython中使用%%macro命令创建宏,并......
  • 7月24号python:库存管理
    7月24号python:库存管理题目:​ 仓库管理员以数组stock形式记录商品库存表。stock[i]表示商品id,可能存在重复。原库存表按商品id升序排列。现因突发情况需要进行商品紧急调拨,管理员将这批商品id提前依次整理至库存表最后。请你找到并返回库存表中编号的最小的元素以便及......
  • IPython的Bash之舞:%%bash命令全解析
    IPython的Bash之舞:%%bash命令全解析IPython的%%bash魔术命令为JupyterNotebook用户提供了一种在单元格中直接执行Bash脚本的能力。这个特性特别适用于需要在Notebook中运行系统命令或Bash特定功能的场景。本文将详细介绍如何在IPython中使用%%bash命令,并提供实际的代码示......
  • Python数据分析与可视化大作业项目说明(含免费代码)
    题目:对全球和中国互联网用户的数据分析与可视化代码下载链接:https://download.csdn.net/download/s44359487yad/89574688一、项目概述1.1.项目背景:互联网是当今时代最重要和最有影响力的技术之一,它已经深刻地改变了人们的生活、工作、学习等方面。互联网用户数据是反映......
  • IPython的跨界魔术:%%javascript命令深度解析
    IPython的跨界魔术:%%javascript命令深度解析IPython,作为Python编程的强大交互式工具,提供了多种魔术命令来扩展其功能。其中,%%javascript魔术命令允许用户在IPythonNotebook中直接执行JavaScript代码,打通了Python和JavaScript两个世界,为数据可视化、Web内容操作等提供了便......