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自动化测试之连接几组测试包实例
Sep 28 Python
VSCode下好用的Python插件及配置
Apr 06 Python
Python爬虫框架Scrapy基本用法入门教程
Jul 26 Python
Python中作用域的深入讲解
Dec 10 Python
Python 脚本获取ES 存储容量的实例
Dec 27 Python
python遍历小写英文字母的方法
Jan 02 Python
python3+PyQt5 实现Rich文本的行编辑方法
Jun 17 Python
python实现的读取网页并分词功能示例
Oct 29 Python
如何关掉pycharm中的python console(图解)
Oct 31 Python
python实现XML解析的方法解析
Nov 16 Python
PySide2出现“ImportError: DLL load failed: 找不到指定的模块”的问题及解决方法
Jun 10 Python
scrapy中如何设置应用cookies的方法(3种)
Sep 22 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
phpmyadmin MySQL 加密配置方法
2009/07/05 PHP
判断、添加和删除WordPress置顶文章的相关PHP函数小结
2015/12/10 PHP
用PHP的socket实现客户端到服务端的通信实例详解
2017/02/04 PHP
网页禁用右键实现代码(JavaScript代码)
2009/10/29 Javascript
说明你的Javascript技术很烂的五个原因
2011/04/26 Javascript
基于JQuery的列表拖动排序实现代码
2013/10/01 Javascript
基于jquery实现简单的手风琴特效
2015/11/24 Javascript
js获取当前日期时间及其它日期操作汇总
2016/03/08 Javascript
JavaScript的React Web库的理念剖析及基础上手指南
2016/05/10 Javascript
JS实现页面跳转参数不丢失的方法
2016/11/28 Javascript
Angular工具方法学习
2016/12/26 Javascript
使用AngularJS编写多选按钮选中时触发指定方法的指令代码详解
2017/07/24 Javascript
VUE饿了么树形控件添加增删改功能的示例代码
2017/10/17 Javascript
elementui更改el-dialog关闭按钮的图标d的示例代码
2020/08/04 Javascript
如何正确解决VuePress本地访问出现资源报错404的问题
2020/12/03 Vue.js
[10:34]DOTA2上海特级锦标赛全纪录
2016/03/25 DOTA
python正则表达式面试题解答
2020/04/28 Python
pandas使用apply多列生成一列数据的实例
2018/11/28 Python
python issubclass 和 isinstance函数
2019/07/25 Python
matplotlib交互式数据光标mpldatacursor的实现
2021/02/03 Python
CSS3 完美实现圆角效果
2009/07/13 HTML / CSS
详解基于canvas的视频遮罩插件
2018/01/04 HTML / CSS
html5移动端价格输入键盘的实现
2019/09/16 HTML / CSS
Jones New York官网:美国女装品牌,受白领女性欢迎
2019/11/26 全球购物
MediaMarkt比利时:欧洲最大电器连锁店
2020/12/21 全球购物
武汉瑞得软件笔试题
2015/10/27 面试题
大学生就业推荐信范文
2013/11/29 职场文书
交通安全标语
2014/06/06 职场文书
机械电子工程专业自荐书
2014/06/10 职场文书
2015年幼儿园元旦游艺活动策划书
2014/12/09 职场文书
万里长城导游词
2015/01/30 职场文书
2015年度党员个人总结
2015/02/14 职场文书
公安机关起诉意见书
2015/05/20 职场文书
2015秋季田径运动会广播稿
2015/08/19 职场文书
2016年法制宣传月活动总结
2016/04/01 职场文书
CSS list-style-type属性使用方法
2023/05/21 HTML / CSS