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代码的打包与发布详解
Jul 30 Python
python回溯法实现数组全排列输出实例分析
Mar 17 Python
python操作列表的函数使用代码详解
Dec 28 Python
Python实现压缩文件夹与解压缩zip文件的方法
Sep 01 Python
Python中实现单例模式的n种方式和原理
Nov 14 Python
利用Python实现手机短信监控通知的方法
Jul 22 Python
django搭建项目配置环境和创建表过程详解
Jul 22 Python
Python基于pyecharts实现关联图绘制
Mar 27 Python
python实现二分类和多分类的ROC曲线教程
Jun 15 Python
在tensorflow实现直接读取网络的参数(weight and bias)的值
Jun 24 Python
Python 如何展开嵌套的序列
Aug 01 Python
Python extract及contains方法代码实例
Sep 11 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仿盗链代码
2012/06/03 PHP
PHP中file_get_contents高?用法实例
2014/09/24 PHP
在Yii2特定页面如何禁用调试工具栏Debug Toolbar详解
2017/08/07 PHP
Laravel框架处理用户的请求操作详解
2019/12/20 PHP
优化JavaScript脚本的性能的几个注意事项
2006/12/22 Javascript
javascript 类定义的4种方法
2009/09/12 Javascript
js或css文件后面跟参数的原因说明
2010/01/09 Javascript
IE下双击checkbox反应延迟问题的解决方法
2014/03/27 Javascript
jquery向上向下取整适合分页查询
2014/09/06 Javascript
微信小程序 swiper组件轮播图详解及实例
2016/11/16 Javascript
AngularJs验证重复密码的方法(两种)
2016/11/25 Javascript
Bootstrap框架实现广告轮播效果
2016/11/28 Javascript
Nodejs中使用phantom将html转为pdf或图片格式的方法
2017/09/18 NodeJs
利用nginx + node在阿里云部署https的步骤详解
2017/12/19 Javascript
微信小程序数字滚动插件使用详解
2018/02/02 Javascript
React Native基础入门之调试React Native应用的一小步
2018/07/02 Javascript
JSON是什么?有哪些优点?JSON和XML的区别?
2019/04/29 Javascript
Openlayers绘制地图标注
2020/09/28 Javascript
Python实现对excel文件列表值进行统计的方法
2015/07/25 Python
Python 中的 else详解
2016/04/23 Python
Python字符串拼接六种方法介绍
2017/12/18 Python
[原创]python爬虫(入门教程、视频教程)
2018/01/08 Python
Python实现读取txt文件并转换为excel的方法示例
2018/05/17 Python
基于python中__add__函数的用法
2019/11/25 Python
python如何安装下载后的模块
2020/07/03 Python
纯CSS实现设置半个字符的样式
2014/07/03 HTML / CSS
酒店个人培训自我鉴定
2013/12/11 职场文书
政治学求职信
2014/06/03 职场文书
团日活动总结怎么写
2014/06/25 职场文书
护林防火标语
2014/06/27 职场文书
房屋财产继承协议书范本
2014/11/03 职场文书
2014年电话销售工作总结
2014/12/01 职场文书
辞职信如何写
2015/02/27 职场文书
学生会辞职信
2015/03/02 职场文书
装修安全责任协议书
2016/03/22 职场文书
一篇文章弄清楚Ajax请求的五个步骤
2022/03/17 Javascript