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将文本分每两行一组并保存到文件
Mar 19 Python
在pandas中遍历DataFrame行的实现方法
Oct 23 Python
Flask 上传自定义头像的实例详解
Jan 09 Python
如何使用Python抓取网页tag操作
Feb 14 Python
python实现同一局域网下传输图片
Mar 20 Python
Django用数据库表反向生成models类知识点详解
Mar 25 Python
Python绘图之柱形图绘制详解
Jul 28 Python
Python实现一个简单的递归下降分析器
Aug 01 Python
Python 带星号(* 或 **)的函数参数详解
Feb 23 Python
python读取pdf格式文档的实现代码
Apr 01 Python
基于Python的EasyGUI学习实践
May 07 Python
详解python的异常捕获
Mar 03 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
zend framework框架中url大小写问题解决方法
2014/08/19 PHP
帝国cms目录结构分享
2015/07/06 PHP
php ajax异步读取rss文档数据
2016/03/29 PHP
goto语法在PHP中的使用教程
2020/09/17 PHP
List the Codec Files on a Computer
2007/06/18 Javascript
checkbox全选/取消全选以及checkbox遍历jQuery实现代码
2009/12/02 Javascript
13个绚丽的Jquery 界面设计网站推荐
2010/09/28 Javascript
情人节单身的我是如何在敲完代码之后收到12束玫瑰的(javascript)
2015/08/21 Javascript
JS实现适合于后台使用的动画折叠菜单效果
2015/09/21 Javascript
jQuery实现的点赞随机数字显示动画效果(附在线演示与demo源码下载)
2015/12/31 Javascript
jQuery插件实现文字无缝向上滚动效果代码
2016/02/25 Javascript
Node.js中使用jQuery的做法
2016/08/17 Javascript
完美解决IE9浏览器出现的对象未定义问题
2016/09/29 Javascript
微信小程序 wxapp地图 map详解
2016/10/31 Javascript
简单学习vue指令directive
2016/11/03 Javascript
ES6学习之变量的解构赋值
2017/02/12 Javascript
JavaScript实现类似淘宝的购物车效果
2017/03/16 Javascript
js贪心算法 钱币找零问题代码实例
2019/09/11 Javascript
基于Vue.js+Nuxt开发自定义弹出层组件
2020/10/09 Javascript
vue 动态生成拓扑图的示例
2021/01/03 Vue.js
[06:20]2015国际邀请赛第三日top10
2015/08/08 DOTA
[54:30]Liquid vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
使用Python的Tornado框架实现一个一对一聊天的程序
2015/04/25 Python
Tensorflow实现卷积神经网络用于人脸关键点识别
2018/03/05 Python
在PyCharm下使用 ipython 交互式编程的方法
2019/01/17 Python
解决python有时候import不了当前的包问题
2019/08/28 Python
Python使用uuid库生成唯一标识ID
2020/02/12 Python
Python文件名匹配与文件复制的实现
2020/12/11 Python
html5 分层屏幕适配的方法
2018/03/16 HTML / CSS
澳大利亚领先的皮肤诊所:Skin Matrix(抗衰老、痤疮专家、药妆护肤)
2018/05/20 全球购物
澳大利亚领先的女帽及配饰公司:Morgan&Taylor
2019/12/01 全球购物
水果超市创业计划书
2014/01/27 职场文书
学习保证书范文
2014/04/30 职场文书
干部四风问题整改措施思想汇报
2014/10/13 职场文书
航班延误投诉信
2015/07/02 职场文书
Log4j.properties配置及其使用
2021/08/02 Java/Android