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 26 Python
Python中用max()方法求最大值的介绍
May 15 Python
Python中splitlines()方法的使用简介
May 20 Python
TensorFlow中权重的随机初始化的方法
Feb 11 Python
Python用for循环实现九九乘法表
May 31 Python
对python sklearn one-hot编码详解
Jul 10 Python
python针对不定分隔符切割提取字符串的方法
Oct 26 Python
Django文件存储 默认存储系统解析
Aug 02 Python
python tkiner实现 一个小小的图片翻页功能的示例代码
Jun 24 Python
python如何运行js语句
Sep 09 Python
Python实现网络聊天室的示例代码(支持多人聊天与私聊)
Jan 27 Python
python实现语音常用度量方法的代码详解
May 25 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
在线短消息收发的程序,不用数据库
2006/10/09 PHP
解析php利用正则表达式解决采集内容排版的问题
2013/06/20 PHP
ThinkPHP简单使用memcache缓存的方法
2016/11/15 PHP
thinkPHP框架实现的无限回复评论功能示例
2018/06/09 PHP
Laravel框架表单验证操作实例分析
2019/09/30 PHP
基于Laravel 多个中间件的执行顺序详解
2019/10/21 PHP
json2.js的初步学习与了解
2011/10/06 Javascript
基于JQUERY的多级联动代码
2012/01/24 Javascript
jQuery在html有效在jsp无效的原因及解决方法
2013/08/02 Javascript
Javascript学习笔记之函数篇(四):arguments 对象
2014/11/23 Javascript
基于jQuery实现的文字按钮表单特效整理
2014/12/07 Javascript
jQuery中大家不太了解的几个方法
2015/03/04 Javascript
javascript实现点击后变换按钮显示文字的方法
2015/05/13 Javascript
JavaScript实现获得所有兄弟节点的方法
2015/07/23 Javascript
js实现iframe框架取值的方法(兼容IE,firefox,chrome等)
2015/11/26 Javascript
bootstrap fileinput完整实例分享
2016/11/08 Javascript
js+html5实现侧滑页面效果
2017/07/15 Javascript
vue地区选择组件教程详解
2018/05/04 Javascript
JavaScript数组特性与实践应用深入详解
2018/12/30 Javascript
vue动态绑定class的几种常用方式小结
2019/05/21 Javascript
JavaScript函数式编程(Functional Programming)纯函数用法分析
2019/05/22 Javascript
[03:48]大碗DOTA
2019/07/25 DOTA
python通过urllib2爬网页上种子下载示例
2014/02/24 Python
Python语言的变量认识及操作方法
2018/02/11 Python
Python学习笔记之While循环用法分析
2019/08/14 Python
opencv 图像腐蚀和图像膨胀的实现
2020/07/07 Python
Python如何实现线程间通信
2020/07/30 Python
html5 css3 动态气泡按钮实例演示
2012/12/02 HTML / CSS
css3针对移动端卡顿问题的解决(动画性能优化)
2020/02/14 HTML / CSS
财务会计专业毕业生自荐信
2013/10/02 职场文书
女大学生自我鉴定
2013/12/09 职场文书
迟到检讨书400字
2014/01/13 职场文书
十八大感想感言
2014/02/10 职场文书
《听鱼说话》教学反思
2014/02/15 职场文书
新兵入伍心得体会
2014/09/04 职场文书
python编程学习使用管道Pipe编写优化代码
2021/11/20 Python