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程序设计入门(1)基本语法简介
Jun 13 Python
介绍Python的@property装饰器的用法
Apr 28 Python
Python的CGIHTTPServer交互实现详解
Feb 08 Python
如何使用Python 打印各种三角形
Jun 28 Python
对django中foreignkey的简单使用详解
Jul 28 Python
python代码实现TSNE降维数据可视化教程
Feb 28 Python
Python基于requests库爬取网站信息
Mar 02 Python
计算Python Numpy向量之间的欧氏距离实例
May 22 Python
python中什么是面向对象
Jun 11 Python
Python3如何使用多线程升程序运行速度
Aug 11 Python
python生成xml时规定dtd实例方法
Sep 21 Python
教你用Python写一个植物大战僵尸小游戏
Apr 25 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
纯真IP数据库的应用 IP地址转化成十进制
2009/06/14 PHP
PHP 将逗号、空格、回车分隔的字符串转换为数组的函数
2012/06/07 PHP
百度工程师讲PHP函数的实现原理及性能分析(二)
2015/05/13 PHP
Docker 如何布置PHP开发环境
2016/06/21 PHP
PHP读书笔记整理_结构语句详解
2016/07/01 PHP
PHP面向对象中new self()与 new static()的区别浅析
2017/08/17 PHP
jQuery之浮动窗口实现代码(两种方法)
2010/09/08 Javascript
自己动手制作jquery插件之自动添加删除行功能介绍
2011/10/14 Javascript
js弹出的对话窗口永远保持居中显示
2012/12/15 Javascript
jquery ajax 简单范例(界面+后台)
2013/11/19 Javascript
js单例模式详解实例
2013/11/21 Javascript
javascript中定义私有方法说明(private method)
2014/01/27 Javascript
JavaScript针对网页节点的增删改查用法实例
2015/02/02 Javascript
JavaScript实现将UPC转换成ISBN的方法
2015/05/26 Javascript
vue,angular,avalon这三种MVVM框架优缺点
2016/04/27 Javascript
jQuery文字轮播特效
2017/02/12 Javascript
JavaScript数据结构中串的表示与应用实例
2017/04/12 Javascript
JavaScript严格模式下关于this的几种指向详解
2017/07/12 Javascript
[原创]js实现保存文本框内容为本地文件兼容IE,chrome,火狐浏览器
2018/02/14 Javascript
element-ui树形控件后台返回的数据+生成组织树的工具类
2020/03/05 Javascript
详解JavaScript自定义函数
2020/07/29 Javascript
深入Python函数编程的一些特性
2015/04/13 Python
python直接获取API传递回来的参数方法
2018/12/17 Python
Flask框架路由和视图用法实例分析
2019/11/07 Python
Python列表解析操作实例总结
2020/02/26 Python
学会迭代器设计模式,帮你大幅提升python性能
2021/01/03 Python
python爬虫scrapy框架之增量式爬虫的示例代码
2021/02/26 Python
HTML5 Canvas之测试浏览器是否支持Canvas的方法
2015/01/01 HTML / CSS
阿迪达斯西班牙官方网站:adidas西班牙
2016/07/21 全球购物
亿阳信通股份有限公司C#笔试题
2016/12/06 面试题
给公司的建议书范文
2014/05/13 职场文书
安全口号大全
2014/06/21 职场文书
设备收款委托书范本
2014/10/02 职场文书
雨花台导游词
2015/02/06 职场文书
护士求职简历自我评价
2015/03/10 职场文书
简单实现一个手持弹幕功能+文字抖动特效
2021/03/31 HTML / CSS