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 相关文章推荐
Windows下搭建python开发环境详细步骤
Jul 20 Python
Windows 7下Python Web环境搭建图文教程
Mar 20 Python
python如何使用unittest测试接口
Apr 04 Python
Python实现 PS 图像调整中的亮度调整
Jun 28 Python
用Python解数独的方法示例
Oct 24 Python
python实现拉普拉斯特征图降维示例
Nov 25 Python
python文件和文件夹复制函数
Feb 07 Python
解决Python pip 自动更新升级失败的问题
Feb 21 Python
spyder 在控制台(console)执行python文件,debug python程序方式
Apr 20 Python
python实现文法左递归的消除方法
May 22 Python
如何用python识别滑块验证码中的缺口
Apr 01 Python
利用Python读取微信朋友圈的多种方法总结
Aug 23 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+DBM的同学录程序(4)
2006/10/09 PHP
解析Win7 XAMPP apache无法启动的问题
2013/06/26 PHP
php过滤表单提交的html等危险代码
2014/11/03 PHP
浅析Yii2集成富文本编辑器redactor实例教程
2016/04/25 PHP
用cookies实现的可记忆的样式切换效果代码下载
2007/12/24 Javascript
关于URL中的特殊符号使用介绍
2011/11/03 Javascript
jquery easyui滚动条部分设置介绍
2013/09/12 Javascript
jQuery中ajax和post处理json的不同示例对比
2014/11/02 Javascript
node+express+jade制作简单网站指南
2014/11/26 Javascript
JS实现的适合做faq或menu滑动效果示例
2016/11/17 Javascript
vue.js指令和组件详细介绍及实例
2017/04/06 Javascript
详解Vue 方法与事件处理器
2017/06/20 Javascript
JS实现手写parseInt的方法示例
2017/09/24 Javascript
Vue源码学习之初始化模块init.js解析
2017/11/02 Javascript
vue 虚拟dom的patch源码分析
2018/03/01 Javascript
微信小程序修改swiper默认指示器样式的实例代码
2018/07/18 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变opacity实现)
2019/01/24 Javascript
JS实现灯泡开关特效
2020/03/30 Javascript
Python中使用Boolean操作符做真值测试实例
2015/01/30 Python
Python Web框架Flask下网站开发入门实例
2015/02/08 Python
对Python中TKinter模块中的Label组件实例详解
2019/06/14 Python
Django3中的自定义用户模型实例详解
2020/08/23 Python
html5本地存储_动力节点Java学院整理
2017/07/12 HTML / CSS
美国领先的家庭智能音响系统品牌:Sonos
2018/07/20 全球购物
adidas菲律宾官网:adidas PH
2020/02/07 全球购物
Linux的文件类型
2016/07/05 面试题
两道JAVA笔试题
2016/09/14 面试题
J2EE模式面试题
2016/10/11 面试题
顺丰快递Java软件工程师面试题
2015/07/31 面试题
新闻专业个人自我评价
2013/09/21 职场文书
学生会离职感言
2014/02/11 职场文书
关于奉献的演讲稿
2014/05/21 职场文书
计算机毕业生自荐信
2014/06/12 职场文书
材料员岗位职责范本
2015/04/11 职场文书
2015教师个人德育工作总结
2015/07/22 职场文书
python游戏开发Pygame框架
2022/04/22 Python