django实现用户登陆功能详解


Posted in Python onDecember 11, 2017

django实现用户登陆功能详解

简介:

Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。

Django是一个开放源代码的Web应用框架,由Python写成。

Django遵守BSD版权,初次发布于2005年7月, 并于2008年9月发布了第一个正式版本1.0 。

Django采用了MVC的软件设计模式,即模型M,视图V和控制器C。

用户名密码登陆实现:

在apps.users下找到views.py文件:
以下代码重写了authenticate()方法,方便用户扩展功能,比如邮箱验证登陆等。
在setting.py中重载一个变量:

AUTHENTICATION_BACKENDS = ('users.views.CustomBackend',)

from django.contrib.auth import authenticate, login
from django.contrib.auth.backends import ModelBackend
from django.db.models import Q
# 继承View 实现基于类的用户登陆
from django.views.generic.base import View 
from .models import UserProfile
# 重写 authenticate 登陆验证方法
class CustomBackend(ModelBackend):
  def authenticate(self, username=None, password=None, **kwargs):
    try:
     # 验证用户名或邮箱, Q提供了一个对象间的或(与&)运算
    user=UserProfile.objects.get(Q(username=username) | Q(email=username))
      # 后台密码为暗文,传入的密码为明文, 所以需要使用check_password()方法验证密码
      if user.check_password(password):
        # 验证成功返回user对象
        return user 
    # 登陆失败返回None
    except Exception as e:
      return None

继承django.views.generic.base中的View类,根据method的不同,对应实现GET和POST的不同处理,一般POST为验证用户登陆,在此基础上还可以添加form处理,减少错误提交,减少对服务器的访问次数。

# 基于类实现用户登陆
class LoginView(View):
  # 会根据 method 调用 post或者get方法
  def get(self, request):
    # 如果method为 GET 重新返回登陆页面
    return render(request, "login.html", {})

  def post(self, request):
    # 验证每个字段是否合法
    login_form = LoginForm(request.POST)
    # 对每个字段进行预处理,如果不合法,直接提示错误信息
    pre_check = login_form.is_valid()
    # 如果合法
    if pre_check:
      # 从POST中取出用户名和密码
      user_name = request.POST.get("username", "")
      if UserProfile.objects.filter(email=user_name):
        return render(request, "register.html", {"register_form": register_form, "msg": "用户已经存在"})
      pass_word = request.POST.get("password", "")
      # 此处为上面重写的authenticate方法
      user = authenticate(username=user_name, password=pass_word)
      if user is not None:   # 如果成功返回对象,失败返回None
        login(request, user) # 调用login方法登陆账号
        return render(request, "index.html")
      else:
        # 登陆失败
        return render(request, "login.html", {"msg":u"用户名或密码错误"})
    else:
      # form验证失败,给出错误信息
      return render(request, "login.html", {"login_form":login_form})

要实现form处理功能,在form.py中定义具体要求即可:

from django import forms
# 继承forms.Form
class LoginForm(forms.Form):
  # 如果为空则报错
  username = forms.CharField(required=True)
  # 同时也可以设定长度限制min_length、max_length
  password = forms.CharField(required=True, min_length=5)

html中要写出登陆出错之后,信息提示的逻辑:

<div class="form-group marb20 {% if login_form.errors.username %}errorput{% endif %}">

form验证错误的提示:

<div class="error btns login-form-tips" id="jsLoginTips">{% for key,error in login_form.errors.items %}{{ error }}{% endfor %} {{ msg }}</div>

总结

以上就是本文关于django实现用户登陆功能详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
Python实现telnet服务器的方法
Jul 10 Python
Python的GUI框架PySide的安装配置教程
Feb 16 Python
python操作excel的方法(xlsxwriter包的使用)
Jun 11 Python
用python代码将tiff图片存储到jpg的方法
Dec 04 Python
Python3批量生成带logo的二维码方法
Jun 24 Python
python实现对服务器脚本敏感信息的加密解密功能
Aug 13 Python
python区分不同数据类型的方法
Oct 14 Python
python文件操作的简单方法总结
Nov 07 Python
解决python-docx打包之后找不到default.docx的问题
Feb 13 Python
详解pycharm配置python解释器的问题
Oct 15 Python
Django启动时找不到mysqlclient问题解决方案
Nov 11 Python
tensorflow2.0教程之Keras快速入门
Feb 20 Python
Python通过Django实现用户注册和邮箱验证功能代码
Dec 11 #Python
Python实现冒泡排序的简单应用示例
Dec 11 #Python
Python最火、R极具潜力 2017机器学习调查报告
Dec 11 #Python
python使用pil进行图像处理(等比例压缩、裁剪)实例代码
Dec 11 #Python
让Python更加充分的使用Sqlite3
Dec 11 #Python
pandas中Timestamp类用法详解
Dec 11 #Python
Python排序搜索基本算法之插入排序实例分析
Dec 11 #Python
You might like
PHP 压缩文件夹的类代码
2009/11/05 PHP
用php或asp创建网页桌面快捷方式的代码
2010/03/23 PHP
php缓冲 output_buffering和ob_start使用介绍
2014/01/30 PHP
laravel migrate初学常见错误的解决方法
2017/10/11 PHP
php文件后缀不强制为.php的实操方法
2019/09/18 PHP
TP5框架安全机制实例分析
2020/04/05 PHP
CSS心形加载的动画源码的实现
2021/03/09 HTML / CSS
如何将网页表格内容导入excel
2014/02/18 Javascript
使用JQuery库提供的扩展功能实现自定义方法
2014/09/09 Javascript
DOM基础教程之模型中的模型节点
2015/01/19 Javascript
javascript制作的简单注册模块表单验证
2015/04/13 Javascript
js实现仿MSN带关闭功能的右下角弹窗代码
2015/09/04 Javascript
举例讲解JavaScript substring()的使用方法
2015/11/09 Javascript
jQuery+css实现非常漂亮的水平导航菜单效果
2016/07/27 Javascript
javascript计算渐变颜色的实例
2017/09/22 Javascript
JS中常用的消息框总结
2018/02/24 Javascript
JS实现的input选择图片本地预览功能示例
2018/08/29 Javascript
Vue.js路由实现选项卡简单实例
2019/07/24 Javascript
JS实现秒杀倒计时特效
2020/01/02 Javascript
通过js随机函数Math.random实现乱序
2020/05/19 Javascript
[00:32]2018DOTA2亚洲邀请赛Newbee出场
2018/04/03 DOTA
[01:35:13]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第一场 1月18日
2021/03/11 DOTA
在Django框架中编写Contact表单的教程
2015/07/17 Python
Python SVM(支持向量机)实现方法完整示例
2018/06/19 Python
python按修改时间顺序排列文件的实例代码
2019/07/25 Python
python rsync服务器之间文件夹同步脚本
2019/08/29 Python
Python更换pip源方法过程解析
2020/05/19 Python
MATLAB数学建模之画图汇总
2020/07/16 Python
兰芝美国网上商城:购买LANEIGE睡眠面膜等
2017/06/30 全球购物
Michael Kors英国官网:美国奢侈品品牌
2019/11/13 全球购物
公司股权转让协议书
2014/04/12 职场文书
竞选卫生委员演讲稿
2014/04/28 职场文书
离婚协议书范文
2015/01/26 职场文书
汤姆索亚历险记读书笔记
2015/06/29 职场文书
党课主持词大全
2015/06/30 职场文书
ElementUI实现el-form表单重置功能按钮
2021/07/21 Javascript