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的socket模块源码中的一些实现要点分析
Jun 06 Python
python实现按任意键继续执行程序
Dec 30 Python
详解python基础之while循环及if判断
Aug 24 Python
matplotlib绘图实例演示标记路径
Jan 23 Python
Python cookbook(数据结构与算法)字典相关计算问题示例
Feb 18 Python
pyqt5 实现工具栏文字图片同时显示
Jun 13 Python
Django Channels 实现点对点实时聊天和消息推送功能
Jul 17 Python
python 实现屏幕录制示例
Dec 23 Python
在Anaconda3下使用清华镜像源安装TensorFlow(CPU版)
Apr 19 Python
python语言的优势是什么
Jun 17 Python
解决Keras中循环使用K.ctc_decode内存不释放的问题
Jun 29 Python
Python模拟键盘输入自动登录TGP
Nov 27 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
php使用websocket示例详解
2014/03/12 PHP
PHP处理会话函数大总结
2015/08/05 PHP
php静态成员方法和静态的成员属性的使用方法
2017/10/26 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
2017/11/16 PHP
jquery获取一组checkbox的值(实例代码)
2013/11/04 Javascript
node.js中的fs.utimesSync方法使用说明
2014/12/15 Javascript
详谈javascript异步编程
2016/02/21 Javascript
node.js插件nodeclipse安装图文教程
2020/10/19 Javascript
浅谈jQuery 中的事件冒泡和阻止默认行为
2016/05/28 Javascript
javascript时间差插件分享
2016/07/18 Javascript
jQuery判断邮箱格式对错实例代码讲解
2017/04/12 jQuery
Js实现中国公民身份证号码有效性验证实例代码
2017/05/03 Javascript
使用async-validator编写Form组件的方法
2018/01/10 Javascript
微信小程序switch开关选择器使用详解
2018/01/31 Javascript
浅析JS中回调函数及用法
2018/07/25 Javascript
axios 实现post请求时把对象obj数据转为formdata
2019/10/31 Javascript
在Django中使用Sitemap的方法讲解
2015/07/22 Python
Python算术运算符实例详解
2017/05/31 Python
Python求解任意闭区间的所有素数
2018/06/10 Python
Python中print函数简单使用总结
2019/08/05 Python
Python超越函数积分运算以及绘图实现代码
2019/11/20 Python
python实现对列表中的元素进行倒序打印
2019/11/23 Python
pytorch实现用CNN和LSTM对文本进行分类方式
2020/01/08 Python
基于Keras的格式化输出Loss实现方式
2020/06/17 Python
万得城电器土耳其网站:欧洲第一大电子产品零售商
2016/10/07 全球购物
中专药剂专业应届毕的自我评价
2013/12/27 职场文书
不假外出检讨书
2014/01/27 职场文书
专家推荐信怎么写
2015/03/25 职场文书
2015年实习单位评语
2015/03/25 职场文书
小学少先队活动总结
2015/05/08 职场文书
大卫科波菲尔读书笔记
2015/06/30 职场文书
教研活动主持词
2015/07/03 职场文书
信息技术教研组工作总结
2015/08/13 职场文书
2016国培研修心得体会
2016/01/08 职场文书
SQL Server实现分页方法介绍
2022/03/16 SQL Server
MySQL实战记录之如何快速定位慢SQL
2022/03/23 MySQL