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抓取Discuz!用户名脚本代码
Dec 30 Python
Python tkinter模块弹出窗口及传值回到主窗口操作详解
Jul 28 Python
使用Python制作微信跳一跳辅助
Jan 31 Python
详解python中的Turtle函数库
Nov 19 Python
浅谈Python爬虫基本套路
Mar 25 Python
python实现对服务器脚本敏感信息的加密解密功能
Aug 13 Python
50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)
Nov 20 Python
tensorflow实现二维平面模拟三维数据教程
Feb 11 Python
解决Python import docx出错DLL load failed的问题
Feb 13 Python
如何将tensorflow训练好的模型移植到Android (MNIST手写数字识别)
Apr 22 Python
python 实现简单的计算器(gui界面)
Nov 11 Python
使用Python制作一盏 3D 花灯喜迎元宵佳节
Feb 26 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
PHP4引用文件语句的对比
2006/10/09 PHP
让你同时上传 1000 个文件 (二)
2006/10/09 PHP
PHP 面向对象 final类与final方法
2010/05/05 PHP
php中定义网站根目录的常用方法
2010/08/08 PHP
ThinkPHP与PHPExcel冲突解决方法
2011/08/08 PHP
PHPMailer邮件发送的实现代码
2013/05/04 PHP
PHP整数取余返回负数的相关解决方法
2014/05/15 PHP
thinkphp的静态缓存用法分析
2014/11/29 PHP
thinkPHP使用pclzip打包备份mysql数据库的方法
2016/04/30 PHP
微信利用PHP创建自定义菜单的方法
2016/08/01 PHP
php文件上传类的分享
2017/07/06 PHP
PHP中数组转换为SimpleXML教程
2019/01/27 PHP
javascript 模式设计之工厂模式学习心得
2010/04/27 Javascript
使用隐藏的new来创建对象
2011/03/29 Javascript
javascript实现一个简单的弹出窗
2016/02/22 Javascript
jQuery实现鼠标选文字发新浪微博的方法
2016/04/02 Javascript
Windows系统下安装Node.js的步骤图文详解
2016/11/15 Javascript
老生常谈JavaScript面向对象基础与this指向问题
2017/10/16 Javascript
angular2路由之routerLinkActive指令【推荐】
2018/05/30 Javascript
详解如何解决Vue和vue-template-compiler版本之间的问题
2018/09/17 Javascript
js中Generator函数的深入讲解
2019/04/07 Javascript
Vue实现商品详情页的评价列表功能
2019/09/04 Javascript
微信小程序如何播放腾讯视频的实现
2019/09/20 Javascript
JavaScript提升机制Hoisting详解
2019/10/23 Javascript
深入了解Vue.js 混入(mixins)
2020/07/23 Javascript
在vue中通过render函数给子组件设置ref操作
2020/11/17 Vue.js
[00:17]游戏风云独家报道:DD赛后说出数字秘密 吓死你们啊!
2014/07/13 DOTA
Django admin美化插件suit使用示例
2017/12/12 Python
浅谈python numpy中nonzero()的用法
2018/04/02 Python
Python基础教程之if判断,while循环,循环嵌套
2019/04/25 Python
css3 position fixed固定居中问题解决方案
2014/08/19 HTML / CSS
HTML5 input placeholder 颜色修改示例
2014/05/30 HTML / CSS
澳大利亚领先的睡衣品牌:Peter Alexander
2016/08/16 全球购物
机关单位人员学雷锋心得体会
2014/03/10 职场文书
中学生检讨书1000字
2014/10/28 职场文书
文言文辞职信
2015/02/28 职场文书