GVKun编程网logo

一个 flask-redis 的案例(flask_redis)

11

本文将带您了解关于一个flask-redis的案例的新内容,同时我们还将为您解释flask_redis的相关知识,另外,我们还将为您提供关于#FlaskCBV,session和redis,以及总结##

本文将带您了解关于一个 flask-redis 的案例的新内容,同时我们还将为您解释flask_redis的相关知识,另外,我们还将为您提供关于# Flask CBV,session和redis,以及总结 ###、Disk is Tape, Flash is Disk、flask 中错误使用 flask.redirect (''/path'') 导致的框架奇怪错误、Flask 学习笔记 01:安装 Flask 模块与入门案例的实用信息。

本文目录一览:

一个 flask-redis 的案例(flask_redis)

一个 flask-redis 的案例(flask_redis)

多容器复杂应用的部署:

Flask+redis,   flask 的 container 访问 redis 的 container

cat app.py

from flask import Flask
from redis import Redis
import os
import socket

app = Flask(__name__)
redis = Redis(host=os.environ.get(''REDIS_HOST'', ''127.0.0.1''), port=6379)

@app.route(''/'')
def hello():
    redis.incr(''hits'')
    return ''Hello Container World! I have been seen %s times and my hostname is %s.\n'' % (redis.get(''hits''),socket.gethostname())

if __name__ == "__main__":

    app.run(host="0.0.0.0", port=5000, debug=True)

cat Dockerfile

FROM python:2.7
LABEL maintaner="lin@gmail.com"
COPY . /app
WORKDIR /app
RUN pip install flask redis
EXPOSE 5000
CMD [ "python", "app.py" ]

1. 创建 redis 的 container:

docker run -d --name redis redis

 

2. dokcer build -t lin/flask-redis .

 

3. 创建 container

docker run -d -p 5000:5000 --link redis --name flask-redis -e REDIS_HOST=redis lin/flask-redis                    #和上面源码的相对应

 

4. 进入上面的 container, 并执行 env 看一下:

docker exec -it flask-redis /bin/bash 

env                         # 环境变量

ping redis      # 在容器里可以 ping redis

 

5. 在主机访问 curl 127.0.0.1:5000。可以访问到

 

# Flask CBV,session和redis,以及总结 ###

# Flask CBV,session和redis,以及总结 ###

Flask CBV,session和redis,以及总结

一丶Flask CBV

# flask cbv 只针对类视图

### 使用cbv
from flask import views # 导入cbv的视图基类 ,views是一个py文件,里面包含3个类

class Login(views.MethodView): # 继承CBV视图基类的最高类
    # ?  为什么定义 get, 默认是通过请求方式找到对应 类函数视图处理
    def get(self):
        return "GET 200 OK!"

    def post(self):
        return "POST 200 OK!"
    
### 需要将CBV添加到路由
	# view_func 中的as_view方法 是把类函数转换成视图函数,也就是 某个请求对应的某个具体函数
app.add_url_rule('/login',view_func=Login.as_view(name="login"))

二丶监听 端口

# 理解为主
"0.0.0.0" 5000
"192.168.14.26" 5000
端口 - 应用程序
包 -> 应用程序

IOS 5层中的最高层
应用 					- 									应用
浏览器-9528		目的:(b"HTTP 1.1 / GET\r\n")			192.168.14.26:9527

服务器接收字符串 b"HTTP 1.1 / GET\r\n"
网卡 b"HTTP 1.1 / GET\r\n" - 操作系统 我这里有一段数据你看看吧
操作系统 解包 - 端口 9527 应用程序 - 9527 这个数据包你看看
Wsgi:9527 - 收到 b"HTTP 1.1 / GET\r\n" 
Flask - Wsgi 帮我把这些数据转换成 对象 environ ,这个对象可以 打点儿调用属性
Flask 收到 Wsgi 转换的 environ对象 request_class Flask Request 样式
Django request.POST 
Flask request.form 


三丶Flask回顾

Flask Request

request.form # 获取formData中的数据
request.args  # 获取 地址URL中的数据
request.data  # 获取原始请求体数据 , content-type 中没有form 的字眼, 类型是字节类型
request.json  # 获取 content-type:application/json 数据,直接返回字典
request.fiels # 获取请求中的文件数据 FileStorge 对象, 可以直接调用save(文件路径)保存

request.method # 获取请求方式
request.path  # 获取请求路径 ,路由地址
request.host_url # 获取请求host地址	
request.cookies  # 获取Cookie的对象
request.headers  # 获取请求头中的数据

Flaks Response

""      # HTTPResponse
render_templates(模版名称) # 默认存储模板的路径templates
redirect('/路由地址')   # 响应头中的:location: http://url/路由地址

Flask 特殊封装
send_file('文件路径')  # 打开并返回文件内容,自动识别文件的类型,响应类型 Content-Type:响应类型
jsonify(dict)  # 返回标准的json格式数据,响应头的Content-Type:application/json

Flask Session

from flask import session

# 必须设置 secret_key 秘钥
application.secret_key = "$%^&*()&^%$%^&*"
app.config["SECRET_KEY"] = "$%^&*()&^%$%^&*"

# 设置session的值
session["user"] = 123

if session.get("user") ---  session["user"] KeyError


#### session 机制理解
交由客户端保管机制

1.session["user"] = "123"
2.序列化session 字符串
3.通过 SECRET_KEY 加密字符串 加密算法
4.cookie中加入 {SESSION_COOKIE_NAME}:SECRET_KEY 加密字符串
    5.返回客户端

    反:
    1.Cookie获取{SESSION_COOKIE_NAME}:SECRET_KEY
        2.通过 SECRET_KEY 解密 字符串 解密算法
        3.反序列化 字符串 字典 - session
        4.session.get("user")

Flask 路由

# 函数 路由
@app.rout("/")
def index():
	pass

* endpoint  # 是app中唯一的 路由和视图函数之间的桥梁
* methods   # 允许请求的方式 ['GET','POST','DELETE','PUT']
* 动态参数路由
	* "/index/<page>"
	* "/look/<xjj>/<picture>"
    def look(xjj,picture):
         pass
* defaults ={"nid":1}  # 视图函数默认参数
* strict_slashes   # 严格遵守路由匹配规则,True 和False ,就是以"/"结尾
* redirect_to # 永久重定向 301 308

# 类 路由
app.add_url_rule("/login",view_func=Login.as_view(name="login"))

Flask 初始化

app=Flask(__name__)

template_folder  # 模板存放路径,os.path.join(root_path,template_folder) ,root_path是当前app对象的目录
static_folder 	# 存放静态文件路径
static_url_path   # 静态文件访问路径,默认是"/{static_folder}"


## import_name # __name__ 锁定当前文件的目录,保证文件唯一
## root_path # 当前application的所在目录 由import_name自动创建
host_matching # 主机位 匹配 config.server_name
static_host # 远程静态文件服务 "{static_host}/{static_folder}"
subdomain_matching  # 支持子域名的主机位匹配
instance_path  # 另一个Flask实例导入
instance_relative_config  # 另一个FlaskConfig导入

Flask 配置 config

app.config  # Flask Config对象
app.debug = True  # 开启debug模式
app.config["DEBUG"] = True  # 开启debug模式
DEBUG 		# 开发环境 log级别低 		重启代码错误透传
TESTING		# 测试环境 log级别较高	
SECRET_KEY   #  开启Session序列化
SESSION_COOKIE_NAME # 在Cookie Session名称 ,默认是session
SESSION_COOKIE_HTTPONLY # 是否只在HTTP请求下开启 session
JSONIFY_MIMETYPE  # 更改 jsonify 时的 Content-Type


### 导入类配置  app.config.from_object() 方法
class DebugConfig(object):
			DEBUG = True
			SECRET_KEY = "%^&*()_"
		
app.config.from_object(DebugConfig)

Flask 蓝图

# 蓝图是不能 run的Flask 实例
# 蓝图中没有Config对象
# 蓝图的作用是隔离应用,隔离路由

# 1.声明蓝图
from flask import Blueprint
bp = Blueprint("蓝图名称全Flask示例唯一",__name__)
# 2. 蓝图路由
@bp.route("application路由一致",url_prefix="/url前缀")
def bp_index():
	pass

# 3. 注册蓝图对象 
app.register_blueprint(bp)

Flask 特殊装饰器

@app.before_request # 在请求进入视图函数之前
@app.after_request # 在响应客户端之前
@app.before_first_request # 启动flask,第一次请求进入视图函数前,只执行一次
@app.errorhandler(404错误参数)  # 重定义 错误信息
def error404(errorMessage):
	return "404"

Flask CBV

Disk is Tape, Flash is Disk

Disk is Tape, Flash is Disk

   

   今天遇到一副来自Google的图罗列了常见操作的时间损耗,见高清大图:

 


  这张图让我想到之前在使用Redis时看到Jim Gray那句被坊间流传许久的话:"Tape is Dead,disk is Tape,Flash is disk,RAM Locality is King".(磁带已死,磁盘是新磁带,闪存是新磁盘,随机存储器局部性是为王道.) 这句话的原始出处在此: http://www.signallake.com/innovation/Flash_is_Good.pdf

 

这里有一篇中文解读: http://www.infoq.com/cn/news/2008/07/ram-is-disk


Jim Gray在过去40年中对技术发展有过巨大的贡献,“内存是新的硬盘,硬盘是新的磁带”是他的名言。“实时”Web应用不断涌现,达到海量规模的系统越来越多,这种后浪推前浪的发展模式对软硬件又有何影响? 

Tim Bray早在网格计算成为热门话题之前,就讨论过以RAM和网络为中心的硬件结构的优势,可以用这种硬件建立比磁盘集群速度更快的RAM集群。
对于数据的随机访问,内存的速度比硬盘高几个数量级(即使是最高端的磁盘存储系统也只是勉强达到1,000次寻道/秒)。其次, 随着数据中心的网络速度提高,访问内存的成本更进一步降低。通过网络访问另一台机器的内存比访问磁盘成本更低。就在我写下这段话的时候,Sun的 Infiniband产品线中有一款具备9个全互联非阻塞端口交换机,每个端口的速度可以达到30Gbit/sec!Voltaire产品的端口甚至更多;简直不敢想象。(如果你想了解这类超高性能网络的最新进展,请关注Andreas Bechtolsheim在Standford开设的课程。)
Tim还指出Jim Gray的名言中后半句所阐述的真理:“对于随机访问,硬盘慢得不可忍受;但如果你把硬盘当成磁带来用,它吞吐连续数据的速率令人震惊;它天生适合用来给以RAM为主的应用做日志(logging and journaling)。” 

时间闪到几年之后的今天,我们发现硬件的发展趋势在RAM和网络领域势头不减,而在硬盘领域则止步不前。Bill McColl提到用于并行计算的海量内存系统已经出现:

内存是新的硬盘!硬盘速度提高缓慢,内存芯片容量指数上升,in-memory软件架构有望给各类数据密集的应用带来数量级的性能提升。小型机架服务器(1U、2U)很快就会具备T字节、甚至更大量的内存,这将会改变服务器架构中内存和硬盘之间的平衡。硬盘将成为新的磁带,像磁带一样作为顺序存储介质使用(硬盘的顺序访问相当快速),而不再是随机存储介质(非常慢)。这里面有着大量的机会,新产品的性能有望提高10倍、100倍。

Dare Obsanjo指出如果不把这句真言当回事,会带来什么样的恶劣后果—— 也就是Twitter正面临的麻烦。论及Twitter的内容管理,Obsanjo说,“如果一个设计只是简单地反映了问题描述,你去实现它就会落入磁盘 I/O的地狱。不管你用Ruby on Rails、Cobol on Cogs、C++还是手写汇编都一样,读写负载照样会害死你。”换言之,应该把随机操作推给RAM,只给硬盘留下顺序操作。 
 
下面是来自slideshare的两份资料(不显示多刷几遍):

Redis -- Memory as the New Disk
View more presentations from Tim Lossen
What every data programmer needs to know about disks
View more PowerPoint from iammutex

 

深入理解计算机系统

回顾一下计算机的经典教材《深入理解计算机系统》中对高速缓存的讲解,书中是从最简单的hello程序切入的:

 


  hello程序的机器指令最初是存放在磁盘上的,当程序加载时,它们被复制到主存;当处理器运行程序时,指令又从主存复制到处理器.相似地,数据串“hello,world\n”初始时在磁盘上,然后复制到主存,最后从主存上复制到显示设备.根据机械原理,较大的存储设备要比较小的存储设备运行得慢,而快速设备的造价远高于同类的低速设备.例如,一个典型系统上的磁盘驱动器可能比主存大1000倍,但是对处理器而言,从磁盘驱动器上读取一个字的时间开销要比从主存中读取的开销大1000万倍.针对这种处理器与主存之间的差异,系统设计者采用了更小,更快的存储设备,即高速缓存存储器(简称高速缓存),作为暂时的集结区域,用来存放处理器近期可能会需要的信息. 

   在处理器和一个又大又慢的设备(例如主存)之间插入一个更小更快的存储设备(例如高速缓存)的想法已经成为了一个普遍的观念.实际上,每个计算机系统中的存储设备都被组织成了一个存储器层次结构,上图所示.在这个层次结构中,从上至下,设备变得访问速度越来越慢,容量越来越大,并且每字节的造价也越来越便宜.寄存器文件在层次结构中位于最顶部,也就是第0级或记为L0.这里我们展示的是三层高速缓存L1到L3,占据存储器层次结构的第1层到第3层.主存在第4层,以此类推存储器层次结构的主要思想是一层上的存储器作为低一层存储器的高速缓存.因此,寄存器文件就是L1的高速缓存,L1是L2的高速缓存,L2是L3的高速缓存,L3是主存的高速缓存,而主存又是磁盘的高速缓存.在某些具有分布式文件系统的网络系统中,本地磁盘就是存储在其他系统中磁盘上的数据的高速缓存.

 

晚安!

flask 中错误使用 flask.redirect (''/path'') 导致的框架奇怪错误

flask 中错误使用 flask.redirect (''/path'') 导致的框架奇怪错误

我在首页的位置使用了如下代码:

import flask
@page_index.route(''/'')
def index():
    flask.redirect(''/pythoncgi/'')

结果站点出现以下错误:

[11/Nov/2019 15:03:01] "GET / HTTP/1.1" 500 -
Traceback (most recent call last):
  File "/usr/local/lib64/python3.6/site-packages/flask/app.py", line 2463, in __call__
    return self.wsgi_app(environ, start_response)
  File "/usr/local/lib64/python3.6/site-packages/flask/app.py", line 2449, in wsgi_app
    response = self.handle_exception(e)
  File "/usr/local/lib64/python3.6/site-packages/flask/app.py", line 1866, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib64/python3.6/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/usr/local/lib64/python3.6/site-packages/flask/app.py", line 2446, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib64/python3.6/site-packages/flask/app.py", line 1952, in full_dispatch_request
    return self.finalize_request(rv)
  File "/usr/local/lib64/python3.6/site-packages/flask/app.py", line 1967, in finalize_request
    response = self.make_response(rv)
  File "/usr/local/lib64/python3.6/site-packages/flask/app.py", line 2097, in make_response
    "The view function did not return a valid response. The"
TypeError: The view function did not return a valid response. The function either returned None or ended without a return statement.

解决方法如下:

@page_index.route(''/'')
def index():
    return flask.redirect(''/pythoncgi/'')

Flask 学习笔记 01:安装 Flask 模块与入门案例

Flask 学习笔记 01:安装 Flask 模块与入门案例

文章目录

一、安装 flask 模块

1、安装 Flask 模块

2、在 Python 里查看 Flask 版本

二、案例演示 ——HelloWorld

1、在 PyCharm 里创建项目 HelloWorld

2、创建 test.py

3、创建 static 和 templates 目录

4、在 static 目录里创建子目录 images,放一张图片 boat.jpg

5、在 templates 里创建 test.html

6、修改 test.py

7、运行程序 test.py

8、访问 http://localhost:5000

9、访问 http://localhost:5000/test


一、安装 flask 模块

1、安装 Flask 模块

pip3 install flask

2、在 Python 里查看 Flask 版本

二、案例演示 ——HelloWorld

1、在 PyCharm 里创建项目 HelloWorld

2、创建 test.py

运行程序,效果如下:

在终端执行命令:curl http://127.0.0.1:5000

在浏览器里访问:http://127.0.0.1:5000

3、创建 static 和 templates 目录

Flask 默认用 static 目录存放静态资源,用 templates 目录存放模板。

当然可以改成其它目录:

app = Flask(''myapp'', static_folder=''path1'', templates=''path2'')

4、在 static 目录里创建子目录 images,放一张图片 boat.jpg

5、在 templates 里创建 test.html

6、修改 test.py

7、运行程序 test.py

8、访问 http://localhost:5000

9、访问 http://localhost:5000/test

项目 HelloWorld 下载链接:https://pan.baidu.com/s/18c69-UnNXhFDRhxM96r68A  提取码:i2l8 

本文分享 CSDN - howard2005。
如有侵权,请联系 support@oschina.cn 删除。
本文参与 “OSC 源创计划”,欢迎正在阅读的你也加入,一起分享。

今天关于一个 flask-redis 的案例flask_redis的讲解已经结束,谢谢您的阅读,如果想了解更多关于# Flask CBV,session和redis,以及总结 ###、Disk is Tape, Flash is Disk、flask 中错误使用 flask.redirect (''/path'') 导致的框架奇怪错误、Flask 学习笔记 01:安装 Flask 模块与入门案例的相关知识,请在本站搜索。

本文标签: