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字典数据对象拆分的简单实现方法
Dec 05 Python
Python内置模块hashlib、hmac与uuid用法分析
Feb 12 Python
Python 记录日志的灵活性和可配置性介绍
Feb 27 Python
Python不同目录间进行模块调用的实现方法
Jan 29 Python
python高斯分布概率密度函数的使用详解
Jul 10 Python
用Python实现二叉树、二叉树非递归遍历及绘制的例子
Aug 09 Python
python实现最速下降法
Mar 24 Python
python爬虫利器之requests库的用法(超全面的爬取网页案例)
Dec 17 Python
Numpy中的数组搜索中np.where方法详细介绍
Jan 08 Python
Django REST framework 限流功能的使用
Jun 24 Python
Python实现Matplotlib,Seaborn动态数据图
May 06 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(7) php 字符串相关应用
2010/03/05 PHP
CodeIgniter图像处理类的深入解析
2013/06/17 PHP
使用symfony命令创建项目的方法
2016/03/17 PHP
使用PHP连接数据库_实现用户数据的增删改查的整体操作示例
2017/09/01 PHP
PHP错误提示It is not safe to rely on the system……的解决方法
2019/03/25 PHP
js算法中的排序、数组去重详细概述
2013/10/14 Javascript
移动设备web开发首选框架:zeptojs介绍
2015/01/29 Javascript
JavaScript 事件入门知识
2015/04/13 Javascript
浅谈js的url解析函数封装
2016/06/28 Javascript
JS实现六边形3D拖拽翻转效果的方法
2016/09/11 Javascript
jQuery实现移动端手机商城购物车功能
2016/09/24 Javascript
jQuery通过ajax方法获取json数据不执行success的原因及解决方法
2016/10/15 Javascript
老生常谈js中0到底是 true 还是 false
2017/03/08 Javascript
JS实现含有中文字符串的友好截取功能分析
2017/03/13 Javascript
angular4中关于表单的校验示例
2017/10/16 Javascript
jquery+ajax实现上传图片并显示上传进度功能【附php后台接收】
2019/06/06 jQuery
Python多层嵌套list的递归处理方法(推荐)
2016/06/08 Python
详解Python的Flask框架中的signals信号机制
2016/06/13 Python
vscode 远程调试python的方法
2017/12/01 Python
pycharm设置注释颜色的方法
2018/05/23 Python
解决pyinstaller打包运行程序时出现缺少plotly库问题
2020/06/02 Python
python给list排序的简单方法
2020/12/10 Python
给老师的道歉信
2014/01/11 职场文书
大学班长的职责
2014/01/27 职场文书
《阳光》教学反思
2014/02/23 职场文书
父母寄语大全
2014/04/12 职场文书
产品包装策划方案
2014/05/18 职场文书
大学新生军训自我鉴定
2014/09/18 职场文书
2014年加油站工作总结
2014/12/04 职场文书
作文批改评语
2014/12/25 职场文书
见习期个人总结
2015/03/05 职场文书
工厂仓管员岗位职责
2015/04/01 职场文书
医院财务人员岗位职责
2015/04/14 职场文书
表扬信格式模板
2015/05/05 职场文书
用基于python的appium爬取b站直播消费记录
2021/04/17 Python
mysql在项目中怎么选事务隔离级别
2021/05/25 MySQL