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 Mysql自动备份脚本
Jul 14 Python
python 数据清洗之数据合并、转换、过滤、排序
Feb 12 Python
python 专题九 Mysql数据库编程基础知识
Mar 16 Python
python获取网页中所有图片并筛选指定分辨率的方法
Mar 31 Python
解决Python中list里的中文输出到html模板里的问题
Dec 17 Python
对django xadmin自定义菜单的实例详解
Jan 03 Python
详解Python中pandas的安装操作说明(傻瓜版)
Apr 08 Python
python面试题之列表声明实例分析
Jul 08 Python
Django REST Framework之频率限制的使用
Sep 29 Python
python脚本调用iftop 统计业务应用流量的思路详解
Oct 11 Python
Django中ORM的基本使用教程
Dec 22 Python
Python线程池与GIL全局锁实现抽奖小案例
Apr 13 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
深入PHP5中的魔术方法详解
2013/06/17 PHP
php使用strtotime和date函数判断日期是否有效代码分享
2013/12/25 PHP
javascript 一个自定义长度的文本自动换行的函数
2007/08/19 Javascript
百度留言本js 大家可以参考下
2009/10/13 Javascript
单独使用CKFinder选择图片的方法
2010/08/21 Javascript
跟我学习javascript的Date对象
2015/11/19 Javascript
JavaScript中的原型继承基础学习教程
2016/05/06 Javascript
D3.js实现雷达图的方法详解
2016/09/22 Javascript
jQuery模拟淘宝购物车功能
2017/02/27 Javascript
微信小程序block的使用教程
2018/04/01 Javascript
Vue 组件传值几种常用方法【总结】
2018/05/28 Javascript
swiper实现异形轮播效果
2019/11/28 Javascript
[39:21]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.24
2019/09/10 DOTA
[38:32]完美世界DOTA2联赛循环赛 Forest vs DM 第二场 11.06
2020/11/06 DOTA
详解Python读取配置文件模块ConfigParser
2017/05/11 Python
Python 读取指定文件夹下的所有图像方法
2018/04/27 Python
分享vim python缩进等一些配置
2018/07/02 Python
pyQT5 实现窗体之间传值的示例
2019/06/20 Python
python列表推导式入门学习解析
2019/12/02 Python
如何基于Python制作有道翻译小工具
2019/12/16 Python
Python 实现训练集、测试集随机划分
2020/01/08 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
2020/03/30 Python
tensorflow安装成功import tensorflow 出现问题
2020/04/16 Python
150行python代码实现贪吃蛇游戏
2020/04/24 Python
详解Pandas 处理缺失值指令大全
2020/07/30 Python
Java面试中常遇到的问题,也是需要注意的几点
2013/08/30 面试题
Internal修饰符有什么含义
2013/07/10 面试题
Linux内核产生并发的原因
2012/07/13 面试题
对祖国的寄语大全
2014/04/11 职场文书
史学专业毕业生求职信
2014/05/09 职场文书
计算机专业自荐信范文
2014/05/28 职场文书
公安交警中队队长个人对照检查材料思想汇报
2014/10/05 职场文书
宣传稿格式范文
2015/07/23 职场文书
2016大学生党校学习心得体会
2016/01/06 职场文书
Java 超详细讲解ThreadLocal类的使用
2022/04/07 Java/Android
MyBatis XPathParser解析器使用范例详解
2022/07/15 Java/Android