Python制作简易注册登录系统


Posted in Python onDecember 15, 2016

这次我主要讲解如何用Python基于Flask的登录和注册,验证方式采用Basic Auth

主要用以下库

import os
#Flask的基础库
from flask import Flask, abort, request, jsonify, g, url_for
#Flaks的数据库操作的库
from flask.ext.sqlalchemy import SQLAlchemy
#Flask登录注册的库
from flask.ext.httpauth import HTTPBasicAuth
#加密解密密码的库
from passlib.apps import custom_app_context as pwd_context
#URL安全序列化工具
from itsdangerous import (TimedJSONWebSignatureSerializer
             as Serializer, BadSignature, SignatureExpired)

首先当然是初始化

app = Flask(__name__)
# 设置密钥
app.config['SECRET_KEY'] = 'the quick brown fox jumps over the lazy dog'
# 数据库的配置
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.sqlite'
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True

#数据库初始化
db = SQLAlchemy(app)
# 验证的初始化
auth = HTTPBasicAuth()

然后是建模

SQLAlchemy是ORM模型操作数据库的,所以是非常的方便
除了基本的属性之后我们我定义了一些必要的方法

class User(db.Model):
  __tablename__ = 'users'
  id = db.Column(db.Integer, primary_key=True)
  username = db.Column(db.String(32), index=True)
  password_hash = db.Column(db.String(64))
  # 加密密码
  def hash_password(self, password):
    self.password_hash = pwd_context.encrypt(password)
  # 验证密码
  def verify_password(self, password):
    return pwd_context.verify(password, self.password_hash)
  # 生成token,并设置过期时间
  def generate_auth_token(self, expiration=600):
    s = Serializer(app.config['SECRET_KEY'], expires_in=expiration)
    return s.dumps({'id': self.id})
  # 静态的验证token的方法
  @staticmethod
  def verify_auth_token(token):
    s = Serializer(app.config['SECRET_KEY'])
    try:
      data = s.loads(token)
    except SignatureExpired:
      return None  # token过期
    except BadSignature:
      return None  # token无效
    user = User.query.get(data['id'])
    return user

注册功能

@app.route('/api/users', methods=['POST'])
def new_user():
  username = request.json.get('username')
  password = request.json.get('password')
  if username is None or password is None:
    abort(400)  # 用户名或者密码为空
  if User.query.filter_by(username=username).first() is not None:
    abort(400)  # 用户已存在
  user = User(username=username)
  # 加密密码
  user.hash_password(password)
  # 保存进数据库
  db.session.add(user)
  db.session.commit()
  # 成功注册后返回用户名,Location后面接着的是跳转的地址
  return (jsonify({'username': user.username}), 201,
      {'Location': url_for('get_user', id=user.id, _external=True)})

登录功能

# 登录后获取token
@app.route('/api/token')
@auth.login_required
def get_auth_token():
  # 设置token过期时间
  token = g.user.generate_auth_token(600)
  return jsonify({'token': token.decode('ascii'), 'duration': 600})

获取token后之后,每次请求只需传token就好了

我们可以通过一个方法验证token是否有效

# 可以通过token或者账号密码登录
@app.route('/api/resource')
@auth.login_required
def get_resource():
  # 如果token有效的话就返回username
  return jsonify({'data': 'Hello, %s!' % g.user.username})

细心的人会发现上面这两个方法前都带有@auth.login_required,这其实就是奥妙之处

# 有@auth.login_required标志的都要调用这个方法,传token或者传账号和密码
@auth.verify_password
def verify_password(username_or_token, password):
  # 首先验证token
  user = User.verify_auth_token(username_or_token)
  if not user:
    # 然后再验证用户名和密码
    user = User.query.filter_by(username=username_or_token).first()
    if not user or not user.verify_password(password):
      return False
  g.user = user
  return True

最后写一个入口方法

if __name__ == '__main__':
  # 如果这个数据库不存在就创建
  if not os.path.exists('db.sqlite'):
    db.create_all()
  app.run(debug=True)

这样就大功告成了

效果图

注册

Python制作简易注册登录系统

登录

Python制作简易注册登录系统

验证token

Python制作简易注册登录系统

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
用Python的Tornado框架结合memcached页面改善博客性能
Apr 24 Python
Python文档生成工具pydoc使用介绍
Jun 02 Python
Python素数检测实例分析
Jun 15 Python
Python爬虫爬取美剧网站的实现代码
Sep 03 Python
python非递归全排列实现方法
Apr 10 Python
Python标准库笔记struct模块的使用
Feb 22 Python
pandas DataFrame索引行列的实现
Jun 04 Python
简单了解python中对象的取反运算符
Jul 01 Python
如何修复使用 Python ORM 工具 SQLAlchemy 时的常见陷阱
Nov 19 Python
python实现UDP协议下的文件传输
Mar 20 Python
详解Python IO口多路复用
Jun 17 Python
Python 数据的累加与统计的示例代码
Aug 03 Python
用yum安装MySQLdb模块的步骤方法
Dec 15 #Python
Python3.6正式版新特性预览
Dec 15 #Python
再谈Python中的字符串与字符编码(推荐)
Dec 14 #Python
Python文件操作,open读写文件,追加文本内容实例
Dec 14 #Python
你所不知道的Python奇技淫巧13招【实用】
Dec 14 #Python
通过Python爬虫代理IP快速增加博客阅读量
Dec 14 #Python
Python实现并行抓取整站40万条房价数据(可更换抓取城市)
Dec 14 #Python
You might like
PHP4 与 MySQL 数据库操作函数详解
2006/12/06 PHP
利用PHP实现智能文件类型检测的实现代码
2011/08/02 PHP
PHP has encountered a Stack overflow问题解决方法
2014/11/03 PHP
基础的WordPress插件制作教程
2015/11/24 PHP
thinkPHP中钩子的两种配置调用方法详解
2016/11/11 PHP
PHP开发APP端微信支付功能
2017/02/17 PHP
JS 文件传参及处理技巧分析
2010/05/13 Javascript
将HTMLCollection/NodeList/伪数组转换成数组的实现方法
2011/06/20 Javascript
js实现可拖动DIV的方法
2013/12/17 Javascript
js 获取浏览器版本以此来调整CSS的样式
2014/06/03 Javascript
以Python代码实例展示kNN算法的实际运用
2015/10/26 Javascript
跟我学习javascript的prototype使用注意事项
2015/11/17 Javascript
JQuery fileupload插件实现文件上传功能
2016/03/18 Javascript
ES6 迭代器(Iterator)和 for.of循环使用方法学习(总结)
2018/02/08 Javascript
jQuery中将json数据显示到页面表格的方法
2018/05/27 jQuery
微信小程序与公众号实现数据互通的方法
2019/07/25 Javascript
基于ts的动态接口数据配置的详解
2019/12/18 Javascript
[06:04]DOTA2国际邀请赛纪录片:Just For LGD
2013/08/11 DOTA
[01:24]DOTA2上海特锦赛OG战队抵达 专车接机入驻总统套房
2016/02/23 DOTA
学习python的几条建议分享
2013/02/10 Python
python装饰器与递归算法详解
2016/02/18 Python
解决Scrapy安装错误:Microsoft Visual C++ 14.0 is required...
2017/10/01 Python
Python 删除连续出现的指定字符的实例
2018/06/29 Python
Python实现拷贝/删除文件夹的方法详解
2018/08/29 Python
Python 多线程不加锁分块读取文件的方法
2018/12/11 Python
Python设计模式之观察者模式原理与用法详解
2019/01/16 Python
python运用sklearn实现KNN分类算法
2019/10/16 Python
使paramiko库执行命令时在给定的时间强制退出功能的实现
2021/03/03 Python
飞利浦西班牙官方网站:Philips西班牙
2020/02/17 全球购物
转党组织关系介绍信
2014/01/08 职场文书
《月光启蒙》教学反思
2014/03/01 职场文书
绘画专业自荐信
2014/07/04 职场文书
2014年就业工作总结
2014/11/26 职场文书
民事和解协议书格式
2014/11/29 职场文书
2015年服务员工作总结
2015/04/08 职场文书
学法用法心得体会(2016推荐篇)
2016/01/21 职场文书