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性能优化的20条建议
Oct 25 Python
Python遍历指定文件及文件夹的方法
May 09 Python
python中的全局变量用法分析
Jun 09 Python
python模块之sys模块和序列化模块(实例讲解)
Sep 13 Python
Python3实现从排序数组中删除重复项算法分析
Apr 03 Python
结合OpenCV与TensorFlow进行人脸识别的实现
Oct 10 Python
Python写出新冠状病毒确诊人数地图的方法
Feb 12 Python
Python图像处理库PIL的ImageFilter模块使用介绍
Feb 26 Python
通过python调用adb命令对App进行性能测试方式
Apr 23 Python
matplotlib 生成的图像中无法显示中文字符的解决方法
Jun 10 Python
python实现每天自动签到领积分的示例代码
Aug 18 Python
python pygame入门教程
Jun 01 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
thinkPHP3.2.2框架行为扩展及demo示例
2018/06/19 PHP
Javascript与flash交互通信基础教程
2008/08/07 Javascript
javascript 获取所有id中包含某关键字的控件的实现代码
2010/11/25 Javascript
jQuery右键菜单contextMenu使用实例
2011/09/28 Javascript
jQuery 全选/反选以及单击行改变背景色实例
2013/07/02 Javascript
jquery 层次选择器siblings与nextAll的区别介绍
2013/08/02 Javascript
JavaScript限定复选框的选择个数示例代码
2013/08/25 Javascript
jquery链式操作的正确使用方法
2014/01/06 Javascript
jquery中append()与appendto()用法分析
2014/11/14 Javascript
JS实现自动变化的导航菜单效果代码
2015/09/09 Javascript
vue图片加载与显示默认图片实例代码
2017/03/16 Javascript
jQuery实现的动态文字变化输出效果示例【附演示与demo源码下载】
2017/03/24 jQuery
JS实现的RC4加密算法示例
2018/08/16 Javascript
javascript History对象原理解析
2020/02/17 Javascript
element-ui封装一个Table模板组件的示例
2021/01/04 Javascript
[01:01:43]EG vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
[01:28:44]DOTA2-DPC中国联赛定级赛 RNG vs iG BO3第一场 1月10日
2021/03/11 DOTA
Python连接mssql数据库编码问题解决方法
2015/01/01 Python
Python中尝试多线程编程的一个简明例子
2015/04/07 Python
matplotlib在python上绘制3D散点图实例详解
2017/12/09 Python
简单了解python高阶函数map/reduce
2019/06/28 Python
python的pstuil模块使用方法总结
2019/07/26 Python
基于python-pptx库中文文档及使用详解
2020/02/14 Python
python numpy库linspace相同间隔采样的实现
2020/02/25 Python
python中四舍五入的正确打开方式
2021/01/18 Python
美国渔具店:FishUSA
2019/08/07 全球购物
九年级体育教学反思
2014/01/23 职场文书
争先创优心得体会
2014/09/12 职场文书
大学本科生职业生涯规划书范文
2014/09/14 职场文书
2014党的群众路线教育实践活动总结报告
2014/10/31 职场文书
幼儿园感谢信
2015/01/21 职场文书
工程质量保证书
2015/05/09 职场文书
2016优秀护士求职自荐信
2016/01/28 职场文书
小学教师教学反思
2016/02/24 职场文书
Python数据分析之pandas读取数据
2021/06/02 Python
el-table-column 内容不自动换行的解决方法
2022/08/14 Vue.js