用户已经能够在我们的网站注册了,注册就是为了登录,接下来我们为用户提供登录功能。和注册不同的是,Django 已经为我们写好了登录功能的全部代码,我们不必像之前处理注册流程那样费劲了。只需几分钟的简单配置,就可为用户提供登录功能。接下来就来看看如何使用内置的登录功能。

引入内置的 URL 模型

Django 内置的登录、修改密码、找回密码等视图函数对应的 URL 模式位于 django.contrib.auth.urls.py 中,首先在工程的 urls.py 文件里包含这些 URL 模式。打开 django_auth_example/ 目录下的 urls.py 文件,将 django.contrib.auth.urls.py 包含进来:

django_auth_example/urls.pyfrom django.conf.urls import url, include from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^users/', include('users.urls')), # 将 auth 应用中的 urls 模块包含进来 url(r'^users/', include('django.contrib.auth.urls')), ] 

这将包含以下的 URL 模式:

^users/login/$ [name='login']
^users/logout/$ [name='logout']
^users/password_change/$ [name='password_change']
^users/password_change/done/$ [name='password_change_done']
^users/password_reset/$ [name='password_reset']
^users/password_reset/done/$ [name='password_reset_done']
^users/reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$ [name='password_reset_confirm']
^users/reset/done/$ [name='password_reset_complete']

设置模板路径

默认的登录视图函数渲染的是 registration/login.html 模板,因此需要在 templates/ 目录下新建一个 registration 文件夹,再在 registration/ 目录下新建 login.html 模板文件。此时目录结构为:

django_auth_example/manage.pydjango_auth_example/__init__.pysettings.pyurls.pywsgi.pytemplates/users/register.htmlregistration/login.html

编写登录模板

登录模板的代码和注册模板的代码十分类似:

registration/login.html<!DOCTYPE html>
<html lang="zh-cn"> <head> <meta charset="utf-8"> <meta http-equiv="x-ua-compatible" content="ie=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title>登录</title> <link rel="stylesheet" href="https://unpkg.com/mobi.css/dist/mobi.min.css"> <style> .errorlist { color: red; } </style> </head> <body> <div class="flex-center"> <div class="container"> <div class="flex-center"> <div class="unit-1-2 unit-1-on-mobile"> <h3>登录</h3> <form class="form" action="{% url 'login' %}" method="post"> {% csrf_token %} {{ form.non_field_errors }} {% for field in form %} {{ field.label_tag }} {{ field }} {{ field.errors }} {% if field.help_text %} <p class="help text-small text-muted">{{ field.help_text|safe }}</p> {% endif %} {% endfor %} <button type="submit" class="btn btn-primary btn-block">登录</button> </form> <div class="flex-left top-gap text-small"> <div class="unit-2-3"><span>没有账号?<a href="{% url 'users:register' %}">立即注册</a></span></div> <div class="unit-1-3 flex-right"><span><a href="reset_password.html">忘记密码?</a></span></div> </div> </div> </div> </div> </div> </body> </html> 

为了登录页面的美观我引入了 mobi.css 提供样式支持,其它代码请忽略,我们只关注表单部分的代码。

<form class="form" action="{% url 'login' %}" method="post"> {% csrf_token %} {{ form.non_field_errors }} {% for field in form %} {{ field.label_tag }} {{ field }} {{ field.errors }} {% if field.help_text %} <p class="help text-small text-muted">{{ field.help_text|safe }}</p> {% endif %} {% endfor %} <button type="submit" class="btn btn-primary btn-block">登录</button> </form> 

循环表单字段、渲染控件、渲染帮助信息等在注册表单部分已经讲过,登录表单中只引入了一个新的东西:{{ form.non_field_errors }},这显示的同样是表单错误,但是显示的表单错误是和具体的某个表单字段无关的。相对 {{ field.errors }},这个则显示的是具体某个字段的错误。比如对于字段 username,如果用户输入的 username 不符合要求,比如太长了或者太短了,表单会在 username 下方渲染这个错误。但有些表单错误不和任何具体的字段相关,比如用户输入的用户名和密码无法通过验证,这可能是用户输入的用户名不存在,也可能是用户输入的密码错误,因此这个错误信息将通过 {{ form.non_field_errors }} 渲染。

注意:你可能觉得用户名不存在错误和 username 字段有关,密码错误和 password 字段有关。但是在现代的用户认证系统中,我们不为用户提供这么详细的信息,只是笼统地告知用户名不存在或者密码错误。这能提高一些用户账户的安全性。

此外登录表单的 action 属性的值是 {% url 'login' %},即 auth 应用下的 login 视图函数对应的 URL,用户提交的表单数据将提交给这个 URL,Django 调用 login 视图函数来处理。

不要忘了加 {% csrf_token %} 模板标签。

现在打开开发服务器,在浏览器输入 http://127.0.0.1:8000/users/login/,你将看到一个用户登陆表单。

故意使用一个不存在的账户登录,或者故意输错密码,你将看到表单渲染的非字段相关的错误。

如果用户登录成功,你会发现跳转到了 http://127.0.0.1:8000/accounts/profile/ 页面。由于我们没有写任何视图函数处理这个 URL,所以看到一个 404 错误。不过没有关系,我们目前只关注用户是否已经登录。

如何在模板中判断用户是否已经登录

在模板中判断用户是否已经登录非常简单,使用 {% if user.is_authenticated %} 条件判断即可。借此机会,我们来处理一下网站首页。

在 user/views.py 写一个首页视图函数:

user/views.py def index(request): return render(request, 'index.html') 

为这个视图函数配置 URL 模式,在 django_auth_example/urls.py 进行配置:

from django.conf.urls import url, include from django.contrib import admin from users import views urlpatterns = [ url(r'^admin/', admin.site.urls), # 别忘记在顶部引入 include 函数 url(r'^users/', include('users.urls')), url(r'^users/', include('django.contrib.auth.urls')), # 别忘记在顶部引入 views 模块 url(r'^$', views.index, name='index') ] 

注意:直接在项目的 urls.py 中配置 URL 是不推荐的,应该在应用的 urls.py 下进行配置,然后在项目的 urls.py 中通过 include 函数包含。不过这里作为示例情况特殊,所以姑且这样做。

由于视图渲染了 index.html 文件,因此在 templates/ 目录下建一个 index.html 模板文件(注意我们没有把它放在 users/ 下,也没放在 registration/ 下)。然后写上下面的代码:

templates/index.html<!DOCTYPE html>
<html lang="zh-cn"> <head> <meta charset="utf-8"> <meta http-equiv="x-ua-compatible" content="ie=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title>首页</title> <link rel="stylesheet" href="https://unpkg.com/mobi.css/dist/mobi.min.css"> </head> <body> <div class="flex-center"> <div class="container"> <div> <h1 class="logo"><a href="{% url 'index' %}">Django Auth Example</a></h1> {% if user.is_authenticated %} <p>你已登录,欢迎你:<a href="#">{{ user.username }}</a></p> {% 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 %} </div> </div> </div> </body> </html> 

为了页面的美观,我引入了 mobi.css 提供样式支持。其它代码请忽略,重点只关注用户登录验证部分:

{% if user.is_authenticated %}<p>你已登录,欢迎你:<a href="#">{{ user.username }}</a></p> {% 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 %} 

user.is_authenticated 当用户已经登录时返回 True,否则返回 False。所以已登录的用户将看到欢迎页面,否则将看到登录注册按钮。

你也许奇怪我们在 index 视图中并没有传递 user 模板变量给 index.html,为什么可以在模板中引用 user 呢?这是因为 Django 的 auth 应用为我们设置了模板常量,所以在任何模板中都可以引用 {{ user }}。此外,我们之前提过的 django.contrib.auth.middleware.AuthenticationMiddleware 为所有的请求 request 绑定了一个 user 属性。所以在模板中引用 {{ user }} 和 {{ request.user }} 是等价。

OK 了!不过目前为止,如果你已经登录过了,想要看看未登录的效果会变得比较困难,因为我们还无法注销登录。下面就来给网站添加注销登录的功能吧!

转载于:https://www.cnblogs.com/AmilyWilly/p/8469859.html

django用户认证系统——登录4相关推荐

  1. django用户认证系统——拓展 User 模型2

    Django 用户认证系统提供了一个内置的 User 对象,用于记录用户的用户名,密码等个人信息.对于 Django 内置的 User 模型, 仅包含以下一些主要的属性: username,即用户名 ...

  2. django用户认证系统——注册3

    用户注册就是创建用户对象,将用户的个人信息保存到数据库里.回顾一下 Django 的 MVT 经典开发流程,对用户注册功能来说,首先创建用户模型(M),这一步我们已经完成了.编写注册视图函数(V),并 ...

  3. Django默认用户认证系统和用户模型类

    Django默认用户认证系统和用户模型类 1.Django默认用户认证系统 Django自带用户认证系统 Django认证系统位置 Django认证系统同时处理认证和授权 Django认证系统包含的内 ...

  4. Django(part48)--用户认证系统

    学习笔记,仅供参考 文章目录 用户认证系统 User模型类 auth基本模型操作 创建用户 删除用户 修改密码 检查密码是否正确 用户认证系统 Django自带一个用户认证系统,它处理用户账号.组.权 ...

  5. Django用户认证管理系统(登录|注册|找回密码(邮箱找回)|注销)

    版本: 1. Python 3.6.2 2. Django 1.11.6 3. 虚拟环境 Virtualenv 网站提供登录.注册等用户认证功能是一个常见的需求.因此,Django 提供了一套功能完整 ...

  6. mysql数据库登录认证_MySQL数据库的用户认证系统

    这两天受朋友的托付,要我帮他写一个使用MySQL数据库的用户认证系统.我当然不好推脱的,只得耗费了一晚上的休息时间,写了个很简单的PHP程序.由于赶的很仓卒,可能会太简陋了些,而且可能还会有错误和漏洞 ...

  7. 【Django】认证系统

    目录 #. auth模块 1. 认证 authenticate() 2. 登陆 login(HttpRequest, user) 3. 注销 logout(request) 4. 认证判断 is_au ...

  8. Django的认证系统(auth)

    Django自带的用户认证 : 在开发一个网站时, 无可避免的需要设计实现网站的用户系统. 此时我们需要实现包括用户注册, 用户登录, 用户认证, 注销, 修改密码等功能. Django作为一个完美主 ...

  9. Python Django进阶教程(五)(session,Django用户认证)

    Django版本:1.11 操作系统:Windows Python:3.5 欢迎加入学习交流QQ群:657341423 session(会话),Django用户认证. 每个网站都cookies,会话, ...

最新文章

  1. Apache+Tomcat +mod_proxy集群负载均衡及session
  2. Java 文件上传下载管理器(控制台)
  3. 微服务实践(五):微服务的事件驱动数据管理
  4. iframe URI钓鱼
  5. Linux服务器安全之 fail2ban的安装与配置
  6. JavaWeb SSM酒店信息管理系统
  7. .net 2.0安装包打不开_腾讯悄悄发布 Linux QQ,版本 2.0 Beta
  8. arcgis10.0 sp5下载
  9. 保证成功率的方案,首先要从实施维度入手
  10. 纪年——记事本app
  11. 遥感图像场景分类方法
  12. axure如何竖立文字_Axure pr 如何让文字显示为竖着的?
  13. 电容器的10大总结!
  14. Java中如何将一个数组分割成多个等长度的数组
  15. 拣货单Picket Ticket
  16. 一个小时学会 MySQL 数据库
  17. rule34服务器不稳定,rule34网站
  18. 物质的构成,分子、原子、中子、质子等的关系。
  19. 上海大学计算机学院邢稹,【CES·毕业季】学霸寝室||相约一起“上岸”,我们是最亲密的战友!...
  20. C++_变量/常量/标识符命名规则

热门文章

  1. switch使用中遇到的问题
  2. 芯片,开源,数学,计算机
  3. BZOJ 4568 倍增维护线性基
  4. QT+vs2010下改变可执行程序的图标
  5. [SharePoint][SharePoint2013循序渐进]SPS2013简介
  6. [转载]struts+hibernate遇到的错误总结
  7. perl 安装GD 出错解决方案
  8. mysql卸载权限不够_Linu下启动MySQL结果显示:env: /etc/init.d/mysql:权限不够怎么解决?...
  9. python如何输出两列数据_如何用python将一列数据分为两列?
  10. python3常用模块_Python3 常用模块1