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写的一个定时重跑获取数据库数据
Dec 28 Python
Python实现KNN邻近算法
Jan 28 Python
PyQt5实现类似别踩白块游戏
Jan 24 Python
使用python实现kNN分类算法
Oct 16 Python
Tensorflow 实现分批量读取数据
Jan 04 Python
tensorflow如何继续训练之前保存的模型实例
Jan 21 Python
python获取依赖包和安装依赖包教程
Feb 13 Python
Python面向对象中类(class)的简单理解与用法分析
Feb 21 Python
Django操作session 的方法
Mar 09 Python
Python如何创建装饰器时保留函数元信息
Aug 07 Python
python爬虫爬取图片的简单代码
Jan 18 Python
Python3中最常用的5种线程锁实例总结
Jul 07 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
ThinkPHP CURD方法之order方法详解
2014/06/18 PHP
CodeIgniter针对lighttpd服务器URL重写的方法
2015/06/10 PHP
Jquery实战_读书笔记2 选择器
2010/01/22 Javascript
jQuery 选择器、DOM操作、事件、动画
2010/11/25 Javascript
基于jquery打造的百分比动态色彩条插件
2012/09/19 Javascript
A标签触发onclick事件而不跳转的多种解决方法
2013/06/27 Javascript
细说javascript函数从函数的构成开始
2013/08/29 Javascript
在JavaScript中使用timer示例
2014/05/08 Javascript
jQuery.parseJSON(json)将JSON字符串转换成js对象
2014/07/27 Javascript
jQuery动态背景图片效果实现方法
2015/07/03 Javascript
使用Sticky组件实现带sticky效果的tab导航和滚动导航的方法
2016/03/22 Javascript
React教程之Props验证的具体用法(Props Validation)
2017/09/04 Javascript
Vue中使用canvas方法总结
2019/02/12 Javascript
微信小程序遍历Echarts图表实现多个饼图
2019/04/25 Javascript
php结合js实现多条件组合查询
2019/05/28 Javascript
微信小程序 wxParse插件显示视频问题
2019/09/27 Javascript
Python实现的监测服务器硬盘使用率脚本分享
2014/11/07 Python
Python实现的HTTP并发测试完整示例
2020/04/23 Python
python表格存取的方法
2018/03/07 Python
浅谈Python traceback的优雅处理
2018/08/31 Python
对python_discover方法遍历所有执行的用例详解
2019/02/13 Python
Python文件读写常见用法总结
2019/02/22 Python
Python一个简单的通信程序(客户端 服务器)
2019/03/06 Python
python的range和linspace使用详解
2019/11/27 Python
python GUI库图形界面开发之PyQt5动态加载QSS样式文件
2020/02/25 Python
Python实现的北京积分落户数据分析示例
2020/03/27 Python
英国日常交易网站:Wowcher
2018/09/04 全球购物
养殖行业的创业计划书
2014/01/05 职场文书
《太阳》教学反思
2014/02/21 职场文书
学雷锋志愿者活动总结
2014/06/27 职场文书
12.4全国法制宣传日活动总结
2014/11/01 职场文书
2015年机械设备管理工作总结
2015/05/04 职场文书
2015年学校办公室主任工作总结
2015/07/20 职场文书
礼仪培训心得体会
2016/01/22 职场文书
《我们的民族小学》教学反思
2016/02/19 职场文书
sql server偶发出现死锁的解决方法
2022/04/10 SQL Server