Django实战之用户认证(用户登录与注销)


Posted in Python onJuly 16, 2018

上一篇中,我们已经打开了Django自带的用户认证模块,并配置了数据库连接,创建了相应的表,本篇我们将在Django自带的用户认证的基础上,实现自己个性化的用户登录和注销模块。

首先,我们自己定义一个用户登录表单(forms.py):

from django import forms
from django.contrib.auth.models import User
from bootstrap_toolkit.widgets import BootstrapDateInput, BootstrapTextInput, BootstrapUneditableInput
 
class LoginForm(forms.Form):
  username = forms.CharField(
    required=True,
    label=u"用户名",
    error_messages={'required': '请输入用户名'},
    widget=forms.TextInput(
      attrs={
        'placeholder':u"用户名",
      }
    ),
  )  
  password = forms.CharField(
    required=True,
    label=u"密码",
    error_messages={'required': u'请输入密码'},
    widget=forms.PasswordInput(
      attrs={
        'placeholder':u"密码",
      }
    ),
  )  
  def clean(self):
    if not self.is_valid():
      raise forms.ValidationError(u"用户名和密码为必填项")
    else:
      cleaned_data = super(LoginForm, self).clean()

我们定义的用户登录表单有两个域username和password,这两个域都为必填项。

接下来,我们定义用户登录视图(views.py),在该视图里实例化之前定义的用户登录表单

from django.shortcuts import render_to_response,render,get_object_or_404 
from django.http import HttpResponse, HttpResponseRedirect 
from django.contrib.auth.models import User 
from django.contrib import auth
from django.contrib import messages
from django.template.context import RequestContext
 
from django.forms.formsets import formset_factory
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
 
from bootstrap_toolkit.widgets import BootstrapUneditableInput
from django.contrib.auth.decorators import login_required
 
from .forms import LoginForm
 
def login(request):
  if request.method == 'GET':
    form = LoginForm()
    return render_to_response('login.html', RequestContext(request, {'form': form,}))
  else:
    form = LoginForm(request.POST)
    if form.is_valid():
      username = request.POST.get('username', '')
      password = request.POST.get('password', '')
      user = auth.authenticate(username=username, password=password)
      if user is not None and user.is_active:
        auth.login(request, user)
        return render_to_response('index.html', RequestContext(request))
      else:
        return render_to_response('login.html', RequestContext(request, {'form': form,'password_is_wrong':True}))
    else:
      return render_to_response('login.html', RequestContext(request, {'form': form,}))

该视图实例化了之前定义的LoginForm,它的主要业务逻辑是:

1. 判断必填项用户名和密码是否为空,如果为空,提示"用户名和密码为必填项”的错误信息

2. 判断用户名和密码是否正确,如果错误,提示“用户名或密码错误"的错误信息

3. 登陆成功后,进入主页(index.html)

其中,登录页面的模板(login.html)定义如下:

<!DOCTYPE html>
{% load bootstrap_toolkit %}
{% load url from future %}
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>数据库脚本发布系统</title>
  <meta name="description" content="">
  <meta name="author" content="朱显杰">
  {% bootstrap_stylesheet_tag %}
  {% bootstrap_stylesheet_tag "responsive" %}
  <style type="text/css">
    body {
      padding-top: 60px;
    }
  </style>
  <!--[if lt IE 9]>
  <script src="//html5shim.googlecode.com/svn/trunk/html5.js"></script>
  <![endif]-->
  <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
  {% bootstrap_javascript_tag %}
  {% block extra_head %}{% endblock %}
</head>
 
<body>
 
  {% if password_is_wrong %}
    <div class="alert alert-error">
      <button type="button" class="close" data-dismiss="alert">×</button>
      <h4>错误!</h4>用户名或密码错误
    </div>
  {% endif %}  
  <div class="well">
    <h1>数据库脚本发布系统</h1>
    <p> </p>
    <form class="form-horizontal" action="" method="post">
      {% csrf_token %}
      {{ form|as_bootstrap:"horizontal" }}
      <p class="form-actions">
        <input type="submit" value="登录" class="btn btn-primary">
        <a href="/contactme/" rel="external nofollow" rel="external nofollow" ><input type="button" value="忘记密码" class="btn btn-danger"></a>
        <a href="/contactme/" rel="external nofollow" rel="external nofollow" ><input type="button" value="新员工?" class="btn btn-success"></a>
      </p>
    </form>
  </div>
 
</body>
</html>

最后还需要在urls.py里添加:

(r'^accounts/login/$', 'dbrelease_app.views.login'),

最终的效果如下:

1)当在浏览器里输入http://192.168.1.16:8000/accounts/login/,出现如下登陆界面:

Django实战之用户认证(用户登录与注销)

2)当用户名或密码为空时,提示”用户名和密码为必填项",如下所示:

Django实战之用户认证(用户登录与注销)

3)当用户名或密码错误时,提示“用户名或密码错误",如下所示:

Django实战之用户认证(用户登录与注销)

4)如果用户名和密码都正确,进入主页(index.html)。

既然有login,当然要有logout,logout比较简单,直接调用Django自带用户认证系统的logout,然后返回登录界面,具体如下(views.py):

@login_required
def logout(request):
  auth.logout(request)
  return HttpResponseRedirect("/accounts/login/")

上面@login_required表示只有用户在登录的情况下才能调用该视图,否则将自动重定向至登录页面。

urls.py里添加:

(r'^accounts/logout/$', 'dbrelease_app.views.logout'),

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 模拟登陆的两种实现方法
Aug 10 Python
python实现log日志的示例代码
Apr 28 Python
Python简单计算给定某一年的某一天是星期几示例
Jun 27 Python
python模块导入的细节详解
Dec 10 Python
python实现多张图片拼接成大图
Jan 15 Python
Python中类的创建和实例化操作示例
Feb 27 Python
python基于socket进行端口转发实现后门隐藏的示例
Jul 25 Python
如何基于Python实现电子邮件的发送
Dec 16 Python
keras用auc做metrics以及早停实例
Jul 02 Python
解决使用Pandas 读取超过65536行的Excel文件问题
Nov 10 Python
Python爬虫之Selenium下拉框处理的实现
Dec 04 Python
手把手教你怎么用Python实现zip文件密码的破解
May 27 Python
Python3数据库操作包pymysql的操作方法
Jul 16 #Python
django缓存配置的几种方法详解
Jul 16 #Python
Python 字符串与数字输出方法
Jul 16 #Python
Django实战之用户认证(初始配置)
Jul 16 #Python
python format 格式化输出方法
Jul 16 #Python
Python合并多个Excel数据的方法
Jul 16 #Python
详解django.contirb.auth-认证
Jul 16 #Python
You might like
php中大括号作用介绍
2012/03/22 PHP
php删除字符串末尾子字符,删除开始字符,删除两端字符(实现代码)
2013/06/27 PHP
php随机抽奖实例分析
2015/03/04 PHP
php上传图片生成缩略图(GD库)
2016/01/06 PHP
php中使用websocket详解
2016/09/23 PHP
PHP批量获取网页中所有固定种子链接的方法
2016/11/18 PHP
php mysql数据库操作类(实例讲解)
2017/08/06 PHP
JavaScript面向对象程序设计三 原型模式(上)
2011/12/21 Javascript
Jquery Ajax方法传值到action的方法
2014/05/11 Javascript
Javascript中的方法链(Method Chaining)介绍
2015/03/15 Javascript
js判断当前页面在移动设备还是在PC端中打开
2016/01/06 Javascript
详解vuelidate 对于vueJs2.0的验证解决方案
2017/03/09 Javascript
原生js实现密码输入框值的显示隐藏
2017/07/17 Javascript
JavaScript定义函数的三种实现方法
2017/09/23 Javascript
ES6 Object属性新的写法实例小结
2019/06/25 Javascript
jQuery zTree插件快速实现目录树
2019/08/16 jQuery
JavaScript禁止右击保存图片,禁止拖拽图片的实现代码
2020/04/28 Javascript
vue 中的动态传参和query传参操作
2020/11/09 Javascript
JavaScript中layim之整合右键菜单的示例代码
2021/02/06 Javascript
python基础教程之常用运算符
2014/08/29 Python
在Python中操作字典之setdefault()方法的使用
2015/05/21 Python
深入学习Python中的装饰器使用
2016/06/20 Python
python 遍历字符串(含汉字)实例详解
2017/04/04 Python
分享给Python新手们的几道简单练习题
2017/09/21 Python
CentOS7.3编译安装Python3.6.2的方法
2018/01/22 Python
numpy ndarray 取出满足特定条件的某些行实例
2019/12/05 Python
使用python实现数组、链表、队列、栈的方法
2019/12/20 Python
keras和tensorflow使用fit_generator 批次训练操作
2020/07/03 Python
详解Html5 监听拦截Android返回键方法
2018/04/18 HTML / CSS
Oracle里面常用的数据字典有哪些
2014/02/14 面试题
安全生产目标责任书
2014/04/14 职场文书
优秀大学生自荐信
2014/06/09 职场文书
《你在为谁工作》心得体会(共8篇)
2016/01/20 职场文书
JS 4个超级实用的小技巧 提升开发效率
2021/10/05 Javascript
使用CSS自定义属性实现骨架屏效果
2022/06/21 HTML / CSS
Android实现获取短信验证码并自动填充
2023/05/21 Java/Android