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 相关文章推荐
SublimeText 2编译python出错的解决方法(The system cannot find the file specified)
Nov 27 Python
win10环境下python3.5安装步骤图文教程
Feb 03 Python
Python命令启动Web服务器实例详解
Feb 23 Python
python 将字符串转换成字典dict的各种方式总结
Mar 23 Python
Python实现求两个数组交集的方法示例
Feb 23 Python
pyqt5 lineEdit设置密码隐藏,删除lineEdit已输入的内容等属性方法
Jun 24 Python
python实现控制电脑鼠标和键盘,登录QQ的方法示例
Jul 06 Python
详解如何用python实现一个简单下载器的服务端和客户端
Oct 28 Python
python rsa-oaep加密的示例代码
Sep 23 Python
python smtplib发送多个email联系人的实现
Oct 09 Python
Python 循环读取数据内存不足的解决方案
May 25 Python
python 判断文件或文件夹是否存在
Mar 18 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下利用header()函数设置浏览器缓存的代码
2010/09/01 PHP
解析php防止form重复提交的方法
2013/07/01 PHP
YII视图整合kindeditor扩展的方法
2016/07/13 PHP
php使用函数pathinfo()、parse_url()和basename()解析URL
2016/11/25 PHP
PHP+redis实现的悲观锁机制示例
2018/06/12 PHP
PHP PDOStatement::getAttribute讲解
2019/02/01 PHP
Js 获取HTML DOM节点元素的方法小结
2009/04/24 Javascript
js面向对象 多种创建对象方法小结
2012/05/21 Javascript
javascript学习笔记(十八) 获得页面中的元素代码
2012/06/20 Javascript
js字母大小写转换实现方法总结
2013/11/13 Javascript
适用于javascript开发者的Processing.js入门教程
2016/02/24 Javascript
值得分享的JavaScript实现图片轮播组件
2016/11/21 Javascript
js如何编写简单的ajax方法库
2017/08/02 Javascript
nodejs实现连接mongodb数据库的方法示例
2018/03/15 NodeJs
Angular学习教程之RouterLink花式跳转
2018/05/03 Javascript
解决angularjs中同步执行http请求的方法
2018/08/13 Javascript
layui默认选中table的CheckBox复选框方法
2019/09/19 Javascript
JS图片预加载三种实现方法解析
2020/05/08 Javascript
微信小程序tab左右滑动切换功能的实现代码
2021/02/08 Javascript
python通过urllib2爬网页上种子下载示例
2014/02/24 Python
Python2.7下安装Scrapy框架步骤教程
2017/12/22 Python
Python入门必须知道的11个知识点
2018/03/21 Python
tensorflow 20:搭网络,导出模型,运行模型的实例
2020/05/26 Python
PyInstaller的安装和使用的详细步骤
2020/06/02 Python
python 对象真假值的实例(哪些视为False)
2020/12/11 Python
python 装饰器重要在哪
2021/02/14 Python
解决CSS3的opacity属性带来的层叠顺序问题
2016/05/09 HTML / CSS
全球性的众包图形设计市场:DesignCrowd
2021/02/02 全球购物
什么是makefile? 如何编写makefile?
2013/01/02 面试题
工程管理造价应届生求职信
2013/11/13 职场文书
意向协议书范本
2014/04/23 职场文书
教师个人考察材料
2014/12/16 职场文书
统计员岗位职责范本
2015/04/14 职场文书
重阳节座谈会主持词
2015/07/03 职场文书
《静夜思》教学反思
2016/02/17 职场文书
前端传参数进行Mybatis调用mysql存储过程执行返回值详解
2022/08/14 MySQL