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中有趣在__call__函数
Jun 21 Python
python访问抓取网页常用命令总结
Apr 11 Python
python实现发送邮件功能
Jul 22 Python
Python数据可视化编程通过Matplotlib创建散点图代码示例
Dec 09 Python
Python文本特征抽取与向量化算法学习
Dec 22 Python
python打包生成的exe文件运行时提示缺少模块的解决方法
Oct 31 Python
Python基础学习之时间转换函数用法详解
Jun 18 Python
Python自动化完成tb喵币任务的操作方法
Oct 30 Python
详解Python中打乱列表顺序random.shuffle()的使用方法
Nov 11 Python
python实现飞行棋游戏
Feb 05 Python
python爬取网易云音乐热歌榜实例代码
Aug 07 Python
使用python绘制横竖条形图
Apr 21 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
4月1日重磅发布!《星际争霸II》6.0.0版本更新
2020/04/09 星际争霸
Apache2 httpd.conf 中文版
2006/12/06 PHP
让CodeIgniter的ellipsize()支持中文截断的方法
2014/06/12 PHP
php字符串函数 str类常见用法示例
2020/05/15 PHP
js验证上传图片的方法
2015/05/12 Javascript
跟我学习javascript的this关键字
2020/05/28 Javascript
jquery无限级联下拉菜单简单实例演示
2015/11/23 Javascript
JS区分浏览器页面是刷新还是关闭
2016/04/17 Javascript
jquery树形菜单效果的简单实例
2016/06/06 Javascript
使用jQuery5分钟快速搞定双色表格的简单实例
2016/08/08 Javascript
JavaScript第一篇之实现按钮全选、功能
2016/08/21 Javascript
js数字舍入误差以及解决方法(必看篇)
2017/02/28 Javascript
JavaScript正则获取地址栏中参数的方法
2017/03/02 Javascript
微信小程序 弹框和模态框实现代码
2017/03/10 Javascript
windows系统下更新nodejs版本的方案
2017/11/24 NodeJs
VueJs 将接口用webpack代理到本地的方法
2017/11/27 Javascript
微信小程序实现音乐播放页面布局
2020/12/11 Javascript
对Python中画图时候的线类型详解
2019/07/07 Python
在Django model中设置多个字段联合唯一约束的实例
2019/07/17 Python
Django 用户认证组件使用详解
2019/07/23 Python
Python小程序之在图片上加入数字的代码
2019/11/26 Python
pytorch实现线性拟合方式
2020/01/15 Python
python 插入日期数据到Oracle实例
2020/03/02 Python
python基于socket函数实现端口扫描
2020/05/28 Python
Python实现迪杰斯特拉算法过程解析
2020/09/18 Python
潘多拉意大利官方网上商城:网上选购PANDORA珠宝
2018/10/07 全球购物
世界顶级户外运动品牌折扣网站:LeftLane Sports
2019/06/12 全球购物
linux面试题参考答案(5)
2016/11/05 面试题
自荐信格式范文
2013/10/07 职场文书
优秀交警事迹材料
2014/01/26 职场文书
服装电子商务创业计划书
2014/01/30 职场文书
酒店中秋节活动方案
2014/01/31 职场文书
大学毕业生求职自荐书
2014/06/05 职场文书
医院感染管理制度
2015/08/05 职场文书
评奖评优个人先进事迹材料
2015/11/04 职场文书
2019经典广告词集锦!
2019/07/02 职场文书