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脚本
Feb 10 Python
Python实时获取cmd的输出
Dec 13 Python
详解python进行mp3格式判断
Dec 23 Python
matplotlib调整子图间距,调整整体空白的方法
Aug 03 Python
python 通过麦克风录音 生成wav文件的方法
Jan 09 Python
python实现图书借阅系统
Feb 20 Python
Pandas —— resample()重采样和asfreq()频度转换方式
Feb 26 Python
Python yield的用法实例分析
Mar 06 Python
python中return不返回值的问题解析
Jul 22 Python
使用Pytorch搭建模型的步骤
Nov 16 Python
python解包用法详解
Feb 17 Python
python爬虫scrapy框架之增量式爬虫的示例代码
Feb 26 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中file_exists与is_file,is_dir的区别介绍
2012/09/12 PHP
ajax php传递和接收变量实现思路及代码
2012/12/19 PHP
PHP的cURL库简介及使用示例
2015/02/06 PHP
php 数组元素快速去重
2017/05/05 PHP
PHP守护进程化在C和PHP环境下的实现
2017/11/21 PHP
如何通过Apache在本地配置多个虚拟主机
2020/07/29 PHP
JavaScript 空位补零实现代码
2010/02/26 Javascript
DD_belatedPNG,IE6下PNG透明解决方案(国外)
2010/12/06 Javascript
jquery getScript动态加载JS方法改进详解
2012/11/15 Javascript
javascript结合html5 canvas实现(可调画笔颜色/粗细/橡皮)的涂鸦板
2013/04/27 Javascript
Bootstrap基本样式学习笔记之表单(3)
2016/12/07 Javascript
JS及JQuery对Html内容编码,Html转义
2017/02/17 Javascript
JavaScript简单拖拽效果(1)
2017/05/17 Javascript
详解如何制作并发布一个vue的组件的npm包
2018/11/10 Javascript
Vue替代marquee标签超出宽度文字横向滚动效果
2019/12/09 Javascript
ES6 Object.assign()的用法及其使用
2020/01/18 Javascript
完美解决通过IP地址访问VUE项目的问题
2020/07/18 Javascript
浅谈JavaScript中this的指向问题
2020/07/28 Javascript
nodejs+express最简易的连接数据库的方法
2020/12/23 NodeJs
Python中的异常处理简明介绍
2015/04/13 Python
Python中的choice()方法使用详解
2015/05/15 Python
使用Python的urllib2模块处理url和图片的技巧两则
2016/02/18 Python
使用EduBlock轻松学习Python编程
2018/10/08 Python
python 限制函数执行时间,自己实现timeout的实例
2019/01/12 Python
Virtualenv 搭建 Py项目运行环境的教程详解
2020/06/22 Python
Python通过yagmail实现发送邮件代码解析
2020/10/27 Python
浅析pandas随机排列与随机抽样
2021/01/22 Python
使用Canvas操作像素的方法
2018/06/14 HTML / CSS
Aveda美国官网:天然护发产品、洗发水、护发素和沙龙
2016/12/09 全球购物
施华洛世奇德国官网:SWAROVSKI德国
2017/02/01 全球购物
英国在线药房:Chemist.co.uk
2019/03/26 全球购物
学前教育专业毕业生自荐信
2013/10/03 职场文书
幼儿园六一儿童节活动方案
2014/08/26 职场文书
材料物理专业求职信
2014/09/01 职场文书
社区灵活就业证明
2014/11/03 职场文书
画展邀请函
2015/01/31 职场文书