前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >注销和页面跳转

注销和页面跳转

作者头像
追梦人物
发布于 2018-04-17 06:35:39
发布于 2018-04-17 06:35:39
4.9K00
代码可运行
举报
文章被收录于专栏:Django中文社区Django中文社区
运行总次数:0
代码可运行

当用户想切换登录账号,或者想退出登录状态时,这时候就需要注销已登录的账号。现在我们来为网站添加注销登录的功能,这个功能 Django 也已经为我们提供,我们只需做一点简单配置。

注销登录

注销登录的视图为 logout,我们简单修改一下 index.html 的代码,添加一个注销登录的按钮:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
templates/index.html

{% if user.is_authenticated %}
  <p>你已登录,欢迎你:<a href="#">{{ user.username }}</a></p>
  <button class="btn btn-default"><a href="{% url 'logout' %}">注销登录</a></button>
{% else %}
  <p>你还没有登录,请
    <button class="btn btn-default"><a href="{% url 'login' %}">登录</a></button>
    或者
    <button class="btn btn-default"><a href="{% url 'users:register' %}">注册</a></button>
  </p>
{% endif %}

如果你已经登陆,就会看到一个注销登录的按钮,点击该按钮就会跳转到注销登录已成功地页面。再一次访问首页,你将看到登录、注册按钮,说明你已经成功注销登录状态了。

页面跳转

我们之前在登录、注册和注销的过程中发现,登录成功后会跳转到一个 404 页面,注册成功后返回的是首页,而注销登录后跳转到了 Admin 后台的注销成功页面。对于一个网站来说,比较好的用户体验是登录、注册和注销后跳转回用户之前访问的页面。否则用户在你的网站东跳转西跳转好不容易找到了想看的内容,结果他已登录给他跳转回了首页,这会使用户非常愤怒(我在有些网站就遇到过)。接下来我们看看如何让登录、注册和注销后跳转回用户之前访问的页面。

登录和注销后返回当前页面

在登录和注销的视图函数中,Django 已经为我们处理了跳转回用户之前访问页面的流程。其实现的原理是,在登录和注销的流程中,始终传递一个 next 参数记录用户之前访问页面的 URL。因此,我们需要做的就是在用户访问登录或者注销的页面时,在 URL 中传递一个 next 参数给视图函数,具体做法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
templates/index.html

<button class="btn btn-default">
  <a href="{% url 'logout' %}?next={{ request.path }}">注销登录</a>
</button>

<button class="btn btn-default">
  <a href="{% url 'login' %}?next={{ request.path }}">登录</a>
</button>

可以看到,我们在登录和注销的 URL 后加了 next 参数,其值为 {{ request.path }}。request.path 是用户当前访问页面的 URL。在 URL 中传递参数的方法就是在要传递的参数前加一个 ?然后写上传递的参数名和参数值,用等号链接。关于在 URL 中传递参数具体请 HTTP 的相关协议。

为了在整个登录流程中记录 next 的值,还需要在登录表单中增加一个表单控件,用于传递 next 值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
registration/login.html

<form class="form" action="{% url 'login' %}" method="post">
  ...                 
  <button type="submit" class="btn btn-primary btn-block">登录</button>
  <input type="hidden" name="next" value="{{ next }}"/>
</form>

即在表单中增加了一个隐藏的 input 控件,其值为 {{ next }},即之前通过 URL 参数传递给登录视图函数的,然后登录视图函数又将该值传递给了 login.html 模板。这样在整个登录流程中,始终有一个记录着用户在登录前页面 URL 的变量 next 在视图和模板间来回传递,知道用户登录成功后再跳转回 next 记录的页面 URL。

现在你可以点击登录和注销的按钮来走一遍登录和注销流程,发现页面跳转已经符合我们的需求了。不过还由一点点小瑕疵,就是如果用户不是通过点击登录和注销按钮,而是直接在页面输入 URL 来访问相关页面话,那这个 next 就没有值,从而无法向之前那样跳转回用户之前访问的页面。比如用户想登录,他直接在浏览器的地址栏输入 /users/login/,由于在 URL 中没有传递 next,所以就无法记录用户登录前的页面 URL,那在登录成功后就无法将他带回登录前的页面了。当然这种情况是极为罕见的,很少有用户会记住你网站的 URL 地址,但如果真有这样的用户,我们就把他跳转回首页吧,因为没有任何办法记录他之前访问的页面。要想把用户跳转回首页,可以在 settings 中做如下设置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LOGOUT_REDIRECT_URL = '/'
LOGIN_REDIRECT_URL = '/'

这样,整个登录和注销流程就形成了一个闭环。如果用户通过点击登录或者注销按钮登录和注销的话,在登录或者注销成功后就会被带回登录或者注销前的页面,否则将他带回网站首页。

注册后返回当前页面

类似的,我们也希望用户注册后返回注册前页面。不过由于注册视图函数是我们自己写的,之前的处理方式是用户注册成功后将其带回网站首页,因此需要修改一下注册视图函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
users/views.py

def register(request):
    # 从 get 或者 post 请求中获取 next 参数值
    # get 请求中,next 通过 url 传递,即 /?next=value
    # post 请求中,next 通过表单传递,即 <input type="hidden" name="next" value="{{ next }}"/>
    redirect_to = request.POST.get('next', request.GET.get('next', ''))

    # 只有当请求为 POST 时,才表示用户提交了注册信息
    if request.method == 'POST':
        # request.POST 是一个类字典数据结构,记录了用户提交的注册信息
        # 这里提交的就是用户名(username)、密码(password)、确认密码、邮箱(email)
        # 用这些数据实例化一个用户注册表单
        form = RegisterForm(request.POST)

        # 验证数据的合法性
        if form.is_valid():
            # 如果提交数据合法,调用表单的 save 方法将用户数据保存到数据库
            form.save()

            if redirect_to:
                return redirect(redirect_to)
            else:
                return redirect('/')
    else:
        # 请求不是 POST,表明用户正在访问注册页面,展示一个空的注册表单给用户
        form = RegisterForm()

    # 渲染模板
    # 如果用户正在访问注册页面,则渲染的是一个空的注册表单
    # 如果用户通过表单提交注册信息,但是数据验证不合法,则渲染的是一个带有错误信息的表单
    # 将记录用户注册前页面的 redirect_to 传给模板,以维持 next 参数在整个注册流程中的传递
    return render(request, 'users/register.html', context={'form': form, 'next': redirect_to})

逻辑非常简答,就是首先尝试从用户的 GET 或者 POST 请求中获取 next 参数值,即在注册成功后需要跳转的 URL,如果有值,注册成功后跳转到该 URL,否则跳转回首页。同是不要忘记将该值传给模板,以维持 next 参数在整个注册流程中的传递。

接下来修改模板,和登录模板的设置是一样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
registration/login.html

<button class="btn btn-default">
  <a href="{% url 'users:register' %}?next={{ request.path }}">注册</a>
</button>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
templates/users/register.html

<form class="form" action="{% url 'users:register' %}" method="post">
  ...       
  <button type="submit" class="btn btn-primary btn-block">注册</button>
  <input type="hidden" name="next" value="{{ next }}"/>
</form>

注意:在注册视图函数中,对 next 的任意值我们都进行了跳转,这可能导致一些安全问题。正确的做法应该是在跳转前,对需要跳转的 URL 做安全性检查。不过这里只作为一个示例,在实际项目中请仔细考虑可能的安全后果,以及添加必要的安全性检查代码。

OK,如此修改以后,用户的登录、注册和注销流程的用户体验可以形成一个比较良好闭环了。接下来就来实现修改密码的功能。

总结

本教程的示例项目代码位于 GitHubDjango Auth Example

如果遇到问题,请通过下面的方式寻求帮助。

更多 Django 相关教程,请访问我的个人博客:追梦人物的博客

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Django用户登录与注册系统
一、创建项目 1.1.创建项目和app django-admin startproject mysite_login python manage.py startapp login 1.2.设置时区和语言 Django默认使用美国时间和英语,在项目的settings文件中,如下所示: LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' USE_I18N = True USE_L10N = True USE_TZ = True 我们把它改为亚洲/上海时间和中文 LAN
zhang_derek
2018/04/11
11.7K0
Django用户登录与注册系统
登录
用户已经能够在我们的网站注册了,注册就是为了登录,接下来我们为用户提供登录功能。和注册不同的是,Django 已经为我们写好了登录功能的全部代码,我们不必像之前处理注册流程那样费劲了。只需几分钟的简单配置,就可为用户提供登录功能。接下来就来看看如何使用内置的登录功能。 引入内置的 URL 模型 Django 内置的登录、修改密码、找回密码等视图函数对应的 URL 模式位于 django.contrib.auth.urls.py 中,首先在工程的 urls.py 文件里包含这些 URL 模式。打开 djang
追梦人物
2018/04/17
4.2K0
登录
Django实战-用户注册和登陆系统
每当我们开始一个新项目的时候,通常都会搭建一个全新、独立、隔离的项目环境,这样做的好处自然不必多说。有很多种建立项目虚拟环境的工具,使用比较普遍的是Python中的virtualenv。安装好virtualenv工具后,进入想要放置的项目文件夹,建立一个虚拟环境,激活环境,安装django。
菲宇
2019/07/31
8K0
Django实战-用户注册和登陆系统
JavaWeb项目(四)
(1)在用户模块下的\WEB-INF\pages\system\user\list.jsp页面中找到角色按钮,对应的点击事件和函数的绑定都已完成,roleList方法中向后台UserServelt发送请求,执行userRoleList方法,传递参数用户id
楠羽
2022/11/18
6280
JavaWeb项目(四)
Spring Boot 实现员工信息管理demo
在自定义MVC配置中重写一个 addViewControllers ,用来添加一些基本的视图控制器
LCyee
2020/08/05
1.7K0
Spring Boot 实现员工信息管理demo
Django通过next参数实现登录后跳转回到前一页的3种方法
在实际Python web开发过程中,我们经常会碰到这样的应用场景。当用户试图访问某个页面或评论某个页面时,我们会要求其先登录,然后在用户在登录后自动跳转到用户试图访问的页面。小编我今天就来总结下Django中如何实现用户登录后跳转回前一页的几种方法,希望对大家有所帮助。
菲宇
2019/06/13
2.5K0
Django通过next参数实现登录后跳转回到前一页的3种方法
零基础使用Django2.0.1打造在线教育网站(十一):登录页面实现
努力与运动兼备~~~有任何问题可以加我好友或者关注微信公众号,欢迎交流,我们一起进步!
啃饼思录
2018/09/06
1.8K0
一个完整的Django入门指南(二)
第三部分 Introduction        In this tutorial, we are going to dive deep into two fundamental concepts: URLs and Forms. In the process, we are going to explore many other concepts like creating reusable templates and installing third-party libraries. We are a
zhang_derek
2018/04/11
3.4K0
一个完整的Django入门指南(二)
基于 Go 语言开发在线论坛(四):通过 Cookie + Session 实现用户认证
在此之前,我们现在 handlers 目录下创建一个 helper.go 文件,用于定义一些全局辅助函数(主要用在处理器中):
学院君
2020/04/02
6010
基于 Go 语言开发在线论坛(四):通过 Cookie + Session 实现用户认证
基于Django的电子商务网站开发(连载12)
注册的用户可以通过登录页面登录系统。由于这个模块在前面讲得比较多了,在这里不做过多的解释。
顾翔
2019/12/11
3980
基于Django的电子商务网站开发(连载12)
Django实战(二)- 创建一个课程选择系统1.需求2.代码操作
1.需求 1.登录注册 编写用户注册功能(用户名、密码、确认密码) 提供登录功能 登陆后可以填写个人信息(昵称、年龄、头像) 2.功能 第一个注册用户为管理员,管理员还可以创建、修改、删除课程分类信息,比如(计算机、文学、化学) 管理员可以创建课程(每一门课程只能属于一个课程分类)、修改课程、删除课程、查看选择某一门学科的所有学生列表、查看某一分类的所有学科。 所有用户都可以查看课程列表,并将课程加到自己的已选课程列表中;所有用户可以查看自己选择的课程列表、查看课程详细介绍、从自己的课程列表中
Python攻城狮
2018/08/23
7030
Django实战(二)- 创建一个课程选择系统1.需求2.代码操作
使用Python+Flask开发博客项目,并实现内网穿透
Flask是一个使用python编写的轻量级Web框架,对比其他相同类型的框架而言,这个框架更加的灵活轻便。并且具有很强的定制性,用户可以根据自己的需求添加功能,有强大的插件库,这也是为什么这个框架在python领域一直火热的原因。这篇文章我们将使用这个框架编写一个属于自己的博客网站!并教你如何通过使用内网穿透工具处理项目,让本地的项目可以在公网访问!
大数据小禅
2021/11/10
6960
Python Web聊天室--首页
在layout里创建base.html(基础模板,我们可以在其他的模板里调用这个,可以减少代码重复率)
py3study
2020/01/07
1.6K0
一文看懂Python Django下的用户登录注册注销
我们需要登录,自然是需要用户输入密码等信息,我们建立以下字段信息,并对数据进行迁移
no怕不了木
2024/04/11
3450
关于“Python”的核心知识点整理大全58
这里的注册系统允许用户创建任意数量的账户。有些系统要求用户确认其身份:发送一 封确认邮件,用户回复后其账户才生效。通过这样做,系统生成的垃圾账户将比这里使 用的简单系统少。然而,学习创建应用程序时,完全可以像这里所做的那样,使用简单 的用户注册系统。
用户10920956
2024/01/19
5990
关于“Python”的核心知识点整理大全58
使用django-allauth管理用户登录与注册
 django-allauth 是非常受欢迎的管理用户登录与注册的第三方 Django 安装包,django-allauth 集成了 local 用户系统 和 social 用户系统,其 social 用户系统 可以挂载多个账户。 django-allauth 能实现以下核心功能:
菲宇
2019/06/13
7.3K0
Django提交表单时遇到403错误:CSRF verification failed
django 提交表单 提示403:CSRF verification failed 后台日志: UserWarning: A {% csrf_token %} was used in a template, but the context did not provide the value. This is usually caused by not using RequestContext. "A {% csrf_token %} was used in a template, but the
程序员同行者
2018/07/02
2.1K0
PHP 基于 Cookie + Session 实现用户认证功能
接下来,我们通过 Cookie + Session 来完成博客管理后台的用户认证功能。
学院君
2020/10/19
2.7K0
PHP 基于 Cookie + Session 实现用户认证功能
Node.js基于Express框架搭建一个简单的注册登录Web功能
这个小应用使用到了node.js  bootstrap  express  以及数据库的操作 :使用mongoose对象模型来操作 mongodb
书童小二
2018/09/03
7.5K0
Node.js基于Express框架搭建一个简单的注册登录Web功能
Flask 系列之 Pagination
首先,在我们的 todolist\forms.py 中添加事务添加对应的表单类 ThingForm,示例代码如下所示:
py3study
2020/01/16
6400
推荐阅读
相关推荐
Django用户登录与注册系统
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验