Flask-在Flask中跨请求传递数据资源

30 篇文章 2 订阅

前言

由于项目需要,我想在Flask中跨请求传递数据资源,而且请求接口必须是异步非阻塞的方式,Flask的异步请求已经在这篇文章中解决。

关于g和session

首先我查阅了Flask中的g和session

from flask import g, session

g——处理请求时用作临时存储的对象,每次请求会重设这个变量;
session——用户会话,用于存储请求之间需要「记住」的值的词典;

简单来说,每一个请求的g变量都是独立的g变量,不同请求之间的g的数据是不互通的。

session是可以「记住」前后请求,但是他是使用了浏览器的Cookie,是保存在客户端的一种方法。我这里需要的是保存在服务器的session,所以Flask的session也帮不上忙。

解决办法

一种解决办法是使用外部的内存管理,比如Redis;如果项目足够大,数据资源比较多,使用外部内存管理是正确的方法。可是我现在只是想跨请求传递一点点数据,不想使用Redis。这个时候找到了这篇资料

Flask 本身不提供缓存,但是它的基础库之一Werkzeug有一些非常基本的缓存支持。

Flask的底层——Werkzeug——是有缓存支持的,于是我参考了上面链接提供的例子,简单实现了跨请求传递数据。不用再安装Redis了。

代码清单

# coding=utf-8
# Python Version: 3.5.1

# Flask
from flask import Flask, request, g, current_app

# gevent
from gevent import monkey, sleep
from gevent.pywsgi import WSGIServer
monkey.patch_all()
# gevent end

import time

# Cache
from werkzeug.contrib.cache import SimpleCache
cache = SimpleCache()
# Cache End

app = Flask(__name__)
app.config.update(DEBUG=True)

@app.route('/asyn/', methods=['GET'])
def test_asyn_one():
    print("asyn has a request!")
    cache.clear()
    timeout = 30
    while (not cache.has('a')) and timeout >0:
        sleep(1)
        timeout = timeout - 1
        print('timeout:', timeout)
    print("a", cache.get('a'))
    return 'hello asyn'


@app.route('/test/', methods=['GET'])
def test():
    cache.set('a', '1')
    return 'hello test'


if __name__ == "__main__":
    # app.run()
    http_server = WSGIServer(('', 5000), app)
    http_server.serve_forever()

首先用浏览器请求http://127.0.0.1:5000/asyn/接口,这个时候会打印

asyn has a request!

之后开始倒计时。再请求http://127.0.0.1:5000/test/
最后上面的asyn函数在缓存中找到了key,跳出while循环。

完整打印如下:

asyn has a request!
timeout: 29
timeout: 28
timeout: 27
127.0.0.1 - - [2016-10-24 23:10:30] “GET /test/ HTTP/1.1” 200 126 0.000000
timeout: 26
a 1
127.0.0.1 - - [2016-10-24 23:10:30] “GET /asyn/ HTTP/1.1” 200 126 4.003038

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值