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实现数独算法实例
Jun 09 Python
Python基于有道实现英汉字典功能
Jul 25 Python
Python入门学习之字符串与比较运算符
Oct 12 Python
Python错误: SyntaxError: Non-ASCII character解决办法
Jun 08 Python
Python面向对象编程之继承与多态详解
Jan 16 Python
windows下 兼容Python2和Python3的解决方法
Dec 05 Python
wxpython绘制音频效果
Nov 18 Python
Python命名空间namespace及作用域原理解析
Jun 05 Python
python计算auc的方法
Sep 09 Python
浅析Python的命名空间与作用域
Nov 25 Python
pytorch 把图片数据转化成tensor的操作
Mar 04 Python
据Python爬虫不靠谱预测可知今年双十一销售额将超过6000亿元
Nov 11 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
php5.3中连接sqlserver2000的两种方法(com与ODBC)
2012/12/29 PHP
str_replace只替换一次字符串的方法
2013/04/09 PHP
CI框架中$this->load->library()用法分析
2016/05/18 PHP
9个JavaScript评级/投票插件
2010/01/18 Javascript
jquery中获得$.ajax()事件返回的值并添加事件的方法
2010/04/15 Javascript
JS+Canvas实现的俄罗斯方块游戏完整实例
2016/12/12 Javascript
swiper插件自定义切换箭头按钮
2017/12/28 Javascript
浅析Vue 生命周期
2018/06/21 Javascript
JavaScript设计模式之单例模式简单实例教程
2018/07/02 Javascript
微信小程序云开发之模拟后台增删改查
2019/05/16 Javascript
Vue+Element实现动态生成新表单并添加验证功能
2019/05/23 Javascript
JointJS JavaScript流程图绘制框架解析
2019/08/15 Javascript
Vue+Koa2+mongoose写一个像素绘板的实现方法
2019/09/10 Javascript
JS判断数组四种实现方法详解
2020/06/29 Javascript
[03:46]DOTA2英雄基础教程 维萨吉
2013/12/11 DOTA
python中文件变化监控示例(watchdog)
2017/10/16 Python
python简单图片操作:打开\显示\保存图像方法介绍
2017/11/23 Python
python 创建一个空dataframe 然后添加行数据的实例
2018/06/07 Python
python实现TCP文件传输
2020/03/20 Python
关于Python错误重试方法总结
2021/01/03 Python
猫途鹰英国网站:TripAdvisor英国(旅游社区和旅游评论)
2016/08/30 全球购物
英国时尚家具、家居饰品及礼品商店:Graham & Green
2016/09/15 全球购物
PHP面试题附答案
2015/11/28 面试题
汽车维修与检测专业应届生求职信
2013/11/12 职场文书
服装创业计划书范文
2014/02/05 职场文书
《称象》教学反思
2014/04/25 职场文书
小学优秀辅导员事迹材料
2014/05/11 职场文书
老公保证书
2015/01/17 职场文书
教师个人总结范文
2015/02/11 职场文书
出国留学单位推荐信
2015/03/26 职场文书
小学少先队工作总结2015
2015/05/26 职场文书
2015暑期社会实践个人总结
2015/07/13 职场文书
php+laravel 扫码二维码签到功能
2021/05/15 PHP
教你使用vscode 搭建react-native开发环境
2021/07/07 Javascript
Python实现双向链表
2022/05/25 Python
Vue Mint UI mt-swipe的使用方式
2022/06/05 Vue.js