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实现带验证码网站的自动登陆实现代码
Jan 12 Python
简洁的十分钟Python入门教程
Apr 03 Python
探索Python3.4中新引入的asyncio模块
Apr 08 Python
python中将字典形式的数据循环插入Excel
Jan 16 Python
Python文本统计功能之西游记用字统计操作示例
May 07 Python
Selenium 模拟浏览器动态加载页面的实现方法
May 16 Python
python smtplib模块自动收发邮件功能(二)
May 22 Python
python学生信息管理系统(初级版)
Oct 17 Python
浅析PyTorch中nn.Module的使用
Aug 18 Python
python反转列表的三种方式解析
Nov 08 Python
解决pycharm中导入自己写的.py函数出错问题
Feb 12 Python
python实现堆排序的实例讲解
Feb 21 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序列号生成函数和字符串替换函数代码
2012/06/07 PHP
php多个文件及图片上传实例详解
2014/11/10 PHP
使用PHP把HTML生成PDF文件的几个开源项目介绍
2014/11/17 PHP
Laravel学习基础之migrate的使用教程
2017/10/11 PHP
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
理解Javascript_14_函数形式参数与arguments
2010/10/20 Javascript
javascript 手动给表增加数据的小例子
2013/07/10 Javascript
form表单只提交数据而不进行页面跳转的解决方案
2013/09/18 Javascript
JavaScript代码简单实现求杨辉三角给定行的最大值
2013/10/29 Javascript
浅谈Javascript 执行顺序
2013/12/18 Javascript
使用insertAfter()方法在现有元素后添加一个新元素
2014/05/28 Javascript
jQuery实现仿Google首页拖动效果的方法
2015/05/04 Javascript
jQuery构造函数init参数分析续
2015/05/13 Javascript
jquery简单实现带渐显效果的选项卡菜单代码
2015/09/01 Javascript
快速掌握Node.js事件驱动模型
2016/03/21 Javascript
JavaScript中利用Array filter() 方法压缩稀疏数组
2018/02/24 Javascript
详解vue 数据传递的方法
2018/04/19 Javascript
详解JavaScript中关于this指向的4种情况
2019/04/18 Javascript
ElementUI中el-tree节点的操作的实现
2020/02/27 Javascript
vue+element使用动态加载路由方式实现三级菜单页面显示的操作
2020/08/04 Javascript
解决vue addRoutes不生效问题
2020/08/04 Javascript
swiperjs实现导航与tab页的联动
2020/12/13 Javascript
python负载均衡的简单实现方法
2018/02/04 Python
Python操作Sql Server 2008数据库的方法详解
2018/05/17 Python
python实现大文件分割与合并
2019/07/22 Python
python使用paramiko实现ssh的功能详解
2020/03/06 Python
python 错误处理 assert详解
2020/04/20 Python
python 识别登录验证码图片功能的实现代码(完整代码)
2020/07/03 Python
Tory Burch德国官网:美国时尚生活品牌
2018/01/03 全球购物
世界上最伟大的马产品:Equiderma
2020/01/07 全球购物
Clos19英国:高档香槟、葡萄酒和烈酒在线购物平台
2020/07/10 全球购物
外企财务年会演讲稿
2014/01/03 职场文书
计算机专业职业规划
2014/02/28 职场文书
勤奋学习演讲稿
2014/05/10 职场文书
2014年路政工作总结
2014/12/10 职场文书
2016大学迎新欢迎词
2015/09/29 职场文书