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 相关文章推荐
打开电脑上的QQ的python代码
Feb 10 Python
mvc框架打造笔记之wsgi协议的优缺点以及接口实现
Aug 01 Python
python之消除前缀重命名的方法
Oct 21 Python
Python清空文件并替换内容的实例
Oct 22 Python
使用python进行拆分大文件的方法
Dec 10 Python
python 实现图片旋转 上下左右 180度旋转的示例
Jan 24 Python
Python实现图像去噪方式(中值去噪和均值去噪)
Dec 18 Python
pip install 使用国内镜像的方法示例
Apr 03 Python
简单了解python列表和元组的区别
May 14 Python
解决echarts中饼图标签重叠的问题
May 16 Python
Pycharm同步远程服务器调试的方法步骤
Nov 04 Python
Pygame如何使用精灵和碰撞检测
Nov 17 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扩展编写点滴 技巧收集
2010/03/09 PHP
PHP+jquery+CSS制作头像登录窗(仿QQ登陆)
2016/10/20 PHP
IE和Firefox下event事件杂谈
2009/12/18 Javascript
jquery 多级下拉菜单核心代码
2010/05/21 Javascript
JS保存、读取、换行、转Json报错处理方法
2013/06/14 Javascript
JavaScript中的DSL元编程介绍
2015/03/15 Javascript
js生成随机数的方法实例
2015/10/16 Javascript
使用JavaScript实现弹出层效果的简单实例
2016/05/31 Javascript
把多个JavaScript函数绑定到onload事件处理函数上的方法
2016/09/04 Javascript
微信小程序 scroll-view隐藏滚动条详解
2017/01/16 Javascript
Angular企业级开发——MVC之控制器详解
2017/02/20 Javascript
vue axios同步请求解决方案
2017/09/29 Javascript
jQuery实现的事件绑定功能基本示例
2017/10/11 jQuery
node.js中路由,中间件,ge请求和post请求的参数详解
2017/12/26 Javascript
js定义类的方法示例【ES5与ES6】
2019/07/30 Javascript
JavaScript实现秒杀时钟倒计时
2019/09/29 Javascript
详解Vue中的watch和computed
2020/11/09 Javascript
Vue解决移动端弹窗滚动穿透问题
2020/12/15 Vue.js
如何在vue中使用video.js播放m3u8格式的视频
2021/02/01 Vue.js
[41:41]TFT vs Secret Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
[01:03:22]LGD vs OG 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
python通过ElementTree操作XML获取结点读取属性美化XML
2013/12/02 Python
python之模拟鼠标键盘动作具体实现
2013/12/30 Python
python抓取并保存html页面时乱码问题的解决方法
2016/07/01 Python
Python实现基于KNN算法的笔迹识别功能详解
2018/07/09 Python
Python包资源下载路径报404解决方案
2020/11/05 Python
python+opencv3.4.0 实现HOG+SVM行人检测的示例代码
2021/01/28 Python
市场营销专业个人自荐信格式
2013/09/21 职场文书
国税会议欢迎词
2014/01/16 职场文书
温馨提示标语
2014/06/26 职场文书
镇创先争优活动总结
2014/08/28 职场文书
拖欠货款起诉状
2015/05/20 职场文书
勤俭节约主题班会
2015/08/13 职场文书
创业计划书之宠物店
2019/09/19 职场文书
用Python的绘图库(matplotlib)绘制小波能量谱
2021/04/17 Python
JavaScript ES6的函数拓展
2022/01/18 Javascript