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使用函数默认值实现函数静态变量的方法
Aug 18 Python
Python中random模块生成随机数详解
Mar 10 Python
python 读写、创建 文件的方法(必看)
Sep 12 Python
python中学习K-Means和图片压缩
Nov 20 Python
Python基于贪心算法解决背包问题示例
Nov 27 Python
Python实现获取nginx服务器ip及流量统计信息功能示例
May 18 Python
python删除字符串中指定字符的方法
Aug 13 Python
Python转换字典成为对象,可以用"."方式访问对象属性实例
May 11 Python
python如何写出表白程序
Jun 01 Python
python smtplib发送多个email联系人的实现
Oct 09 Python
如何在Python项目中引入日志
May 31 Python
Python中第三方库Faker的使用详解
Apr 02 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
phpfans留言版用到的数据操作类和分页类
2007/01/04 PHP
PHP数据库万能引擎类adodb配置使用以及实例集锦
2014/06/12 PHP
PHP将字符分解为多个字符串的方法
2014/11/22 PHP
php实现36进制与10进制转换功能示例
2017/01/10 PHP
详谈配置phpstorm完美支持Codeigniter(CI)代码自动完成(代码提示)
2017/04/07 PHP
ThinkPHP框架实现定时执行任务的两种方法分析
2018/09/04 PHP
Yii框架where查询用法实例分析
2019/10/22 PHP
form中限制文本字节数js代码
2007/06/10 Javascript
json对象转字符串如何实现
2012/12/02 Javascript
jquery写个checkbox——类似邮箱全选功能
2013/03/19 Javascript
页面右下角弹出提示框示例代码js版
2013/08/02 Javascript
JavaScript中双叹号(!!)作用示例介绍
2014/04/10 Javascript
微信{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}
2018/10/12 Javascript
解决axios会发送两次请求,有个OPTIONS请求的问题
2018/10/25 Javascript
JavaScript如何使用插值实现图像渐变
2020/06/28 Javascript
Python 迭代器工具包【推荐】
2016/05/06 Python
Python实现PS图像抽象画风效果的方法
2018/01/23 Python
tensorflow TFRecords文件的生成和读取的方法
2018/02/06 Python
浅析python的优势和不足之处
2018/11/20 Python
Python os.access()用法实例
2019/02/18 Python
Python批量将图片灰度化的实现代码
2020/04/11 Python
浅析Python 抽象工厂模式的优缺点
2020/07/13 Python
微信小程序“圣诞帽”的实现思路详解
2017/12/28 HTML / CSS
美国瑜伽品牌:Gaiam
2017/10/31 全球购物
吉尔德利巧克力公司:Ghirardelli Chocolate Company
2019/03/27 全球购物
英国在线照明超市:Castlegate Lights
2019/10/30 全球购物
Ticketmaster意大利:音乐会、节日、艺术和剧院的官方门票
2019/12/23 全球购物
教育系毕业生中文求职信范文
2013/10/06 职场文书
怎么样写好简历中的自我评价
2013/10/25 职场文书
行政助理岗位职责
2013/11/10 职场文书
个人自我鉴定总结
2014/03/25 职场文书
2014年政协工作总结
2014/12/09 职场文书
社区活动总结范文
2015/05/07 职场文书
母婴行业实体、电商模式全面解析
2019/08/01 职场文书
坚持不是死撑,更重要的是心态
2019/08/19 职场文书
MySQL 主从复制数据不一致的解决方法
2022/03/18 MySQL