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的Django框架使用
Feb 18 Python
Python实现随机选择元素功能
Sep 14 Python
Python数据可视化正态分布简单分析及实现代码
Dec 04 Python
pytorch cnn 识别手写的字实现自建图片数据
May 20 Python
Python从Excel中读取日期一列的方法
Nov 28 Python
Python使用到第三方库PyMuPDF图片与pdf相互转换
May 03 Python
Python获取基金网站网页内容、使用BeautifulSoup库分析html操作示例
Jun 04 Python
python中的线程threading.Thread()使用详解
Dec 17 Python
利用setuptools打包python程序的方法步骤
Jan 18 Python
Python安装与卸载流程详细步骤(图解)
Feb 20 Python
Python判断三段线能否构成三角形的代码
Apr 12 Python
Python异常处理机制结构实例解析
Jul 23 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中动态HTML的输出技术
2006/10/09 PHP
php学习笔记之面向对象
2014/11/08 PHP
laravel中的一些简单实用功能
2018/11/03 PHP
PHP中PCRE正则解析代码详解
2019/04/26 PHP
php抽象类和接口知识点整理总结
2019/08/02 PHP
window.location和document.location的区别分析
2008/12/23 Javascript
javascript 打印内容方法小结
2009/11/04 Javascript
Jquery插件 easyUI属性汇总
2011/01/19 Javascript
jQuery插件开发基础简单介绍
2013/01/07 Javascript
js修改table中Td的值(定义td的单击事件)
2013/01/10 Javascript
JavaScript中提前声明变量或函数例子
2014/11/12 Javascript
node.js解决获取图片真实文件类型的问题
2014/12/20 Javascript
JS实现同一个网页布局滑动门和TAB选项卡实例
2015/09/23 Javascript
JS实现合并两个数组并去除重复项只留一个的方法
2015/12/17 Javascript
JS正则替换掉小括号及内容的方法
2016/11/29 Javascript
微信小程序 页面跳转及数据传递详解
2017/03/14 Javascript
vue.js移动端tab组件的封装实践实例
2017/06/30 Javascript
vue页面跳转后返回原页面初始位置方法
2018/02/11 Javascript
vue axios 给生产环境和发布环境配置不同的接口地址(推荐)
2018/05/08 Javascript
Vue CLI 2.x搭建vue(目录最全分析)
2019/02/27 Javascript
js 闭包深入理解与实例分析
2020/03/19 Javascript
python基础教程之数字处理(math)模块详解
2014/03/25 Python
python实现的二叉树定义与遍历算法实例
2017/06/30 Python
Python+Django搭建自己的blog网站
2018/03/13 Python
python dlib人脸识别代码实例
2019/04/04 Python
Python 使用指定的网卡发送HTTP请求的实例
2019/08/21 Python
Selenium之模拟登录铁路12306的示例代码
2020/07/31 Python
pycharm + django跨域无提示的解决方法
2020/12/06 Python
利用HTML5的新特点实现图片文件异步上传
2014/05/29 HTML / CSS
环保倡议书100字
2014/05/15 职场文书
2015年采购部工作总结
2015/04/23 职场文书
运动会宣传稿100字
2015/07/23 职场文书
医学会议开幕词
2016/03/03 职场文书
优秀的商业计划书,让融资一步到位
2019/05/07 职场文书
漫画《催眠麦克风-Dawn Of Divisions》第二卷PV公开
2022/04/05 日漫
JavaScript前端面试扁平数据转tree与tree数据扁平化
2022/06/14 Javascript