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学习小技巧之列表项的排序
May 20 Python
python hbase读取数据发送kafka的方法
Dec 27 Python
python 定时器,实现每天凌晨3点执行的方法
Feb 20 Python
利用Python+阿里云实现DDNS动态域名解析的方法
Apr 01 Python
django中SMTP发送邮件配置详解
Jul 19 Python
关于Pytorch的MLP模块实现方式
Jan 07 Python
python实现用类读取文件数据并计算矩形面积
Jan 18 Python
Python守护进程实现过程详解
Feb 10 Python
Python模块相关知识点小结
Mar 09 Python
windows下的pycharm安装及其设置中文菜单
Apr 23 Python
解决pytorch 保存模型遇到的问题
Mar 03 Python
Pytest中skip skipif跳过用例详解
Jun 30 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中MD5函数使用实例代码
2008/06/07 PHP
php 字符串函数收集
2010/03/29 PHP
php5.4以上版本GBK编码下htmlspecialchars输出为空问题解决方法汇总
2015/04/03 PHP
在Linux系统下一键重新安装WordPress的脚本示例
2015/06/30 PHP
PHP代码优化技巧小结
2015/09/29 PHP
PHP代码判断设备是手机还是平板电脑(两种方法)
2015/10/19 PHP
Yii2配置Nginx伪静态的方法
2017/05/05 PHP
php实现多站点共用session实现单点登录的方法详解
2019/09/18 PHP
JavaScript的public、private和privileged模式
2009/12/28 Javascript
jQuery实现的多级下拉菜单效果代码
2015/08/24 Javascript
今天抽时间给大家整理jquery和ajax的相关知识
2015/11/17 Javascript
基于Javascript实现弹出页面效果
2016/01/01 Javascript
AngularJS实现表单验证功能详解
2017/10/12 Javascript
python基础教程之Hello World!
2014/08/29 Python
python中实现延时回调普通函数示例代码
2017/09/08 Python
Python3使用pandas模块读写excel操作示例
2018/07/03 Python
Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析
2019/04/12 Python
树莓派动作捕捉抓拍存储图像脚本
2019/06/22 Python
Python中typing模块与类型注解的使用方法
2019/08/05 Python
详解Django admin高级用法
2019/11/06 Python
基于python判断字符串括号是否闭合{}[]()
2020/09/21 Python
python+excel接口自动化获取token并作为请求参数进行传参操作
2020/11/10 Python
CSS实现进度条和订单进度条的示例
2020/11/05 HTML / CSS
html5实现的便签特效(实战分享)
2013/11/29 HTML / CSS
AVON雅芳官网:世界上最大的美容化妆品公司之一
2016/11/02 全球购物
科茨沃尔德家居商店:Scotts of Stow
2018/06/29 全球购物
联想法国官方网站:Lenovo法国
2018/10/18 全球购物
应届毕业生就业自荐信
2013/10/26 职场文书
入党申请自荐书范文
2014/02/11 职场文书
主题实践活动总结
2014/05/08 职场文书
品牌服务方案
2014/06/03 职场文书
2014年超市工作总结
2014/11/19 职场文书
三年级上册科学教学计划
2015/01/21 职场文书
幼儿园六一儿童节开幕词
2016/03/04 职场文书
浅谈pytorch中的dropout的概率p
2021/05/27 Python
使用redis生成唯一编号及原理示例详解
2021/09/15 Redis