Flask即插视图与tornado比较
由于公司使用了Tornado框架和Flask框架,之前一直使用的都是Flask框架,已经对url下面紧跟着视图的写法很固执。刚开始接触Tornado框架,对于其url和视图分开的写法思想上无法转变。今天看了Flask的源码和相关教程看到原来 Flask也可以写出和Tornado类似的代码结构--Flask即插视图。
代码如下:
from functools import wraps from flask import Flask, request
from flask.views import MethodView app = Flask(__name__) # get请求装饰器
def decorator_func_get(f):
@wraps(f)
def write(*args, **kwargs):
print(request.method, 'decorator_func_get')
print('You can add some decorator before request into view function!')
return f(*args, **kwargs) return write # post请求装饰器
def decorator_func_post(f):
@wraps(f)
def write(*args, **kwargs):
print(request.method, 'decorator_func_post')
print('You can add some decorator before request into view function!')
return f(*args, **kwargs) return write # 公用装饰器
def decorator_func_all(f):
@wraps(f)
def write(*args, **kwargs):
print(request.method, 'decorator_func_all')
print('You can add some decorator before request into view function!')
return f(*args, **kwargs) return write class User(MethodView):
# 所以http方法进入后都要使用的装饰器
decorators = [decorator_func_all] # 只针对get请求的装饰器
@decorator_func_get
def get(self, user_id):
return f'get uid:{user_id}' # 只针对post请求的装饰器
@decorator_func_post
def post(self):
uid = request.form.get('user_id')
return f'create a user {uid}' def delete(self, user_id):
return f'delete a uid:{user_id}' def put(self, user_id):
return f'update a uid:{user_id}' # 可以重构一个路由注册函数,可以更加方便
user_view = User.as_view('user_api') # 'user_api'为endpoint
app.add_url_rule('/users', defaults={'user_id': None}, view_func=user_view, methods=['GET']) # url:/users,GET
app.add_url_rule('/users', view_func=user_view, methods=['POST']) # url:users,POST
app.add_url_rule('/users/<int:user_id>', view_func=user_view, methods=['GET', 'PUT', 'DELETE']) # url:users,POST app.run(host='127.0.0.1', port=8000, debug=True)
其实对于即插视图的add_url_rule()方法和如下的route()方法都是一样的,因为源码中,route()调用的就是add_url_rule()方法。
代码段:1
@app.route('/', methods=['GET', 'POST'])
@some_decorator
def index():
data = {
'msg': 'API SERVER IS RUNNING~',
'version': version,
}
data.update(get_version_ctrl())
return msg(data)
即插视图优点:
- 可以更好的理解tornado框架的大致框架结构。
- 写出更容易符合RestFul风格的代码,因为对于资源的增删改查,通过get,post等方法对应到相关的类方法上。
- 不用像 代码段:1 中那样,在GET,POST都存在时,使用
if request.method=='GET':
print('do some get method things')
else:
print('do some other method things')如此费事恶心的代码
- 解耦代码,不用像 代码段:1 中那样装饰器只能对整个视图函数使用,无法具体到对应的不同的请求方法上。
- 路由集中管理
Tornado框架简单程序(主要体现其注册视图函数的方法和flask的即插视图很像):
import torndb
import tornado.web
import tornado.ioloop
from tornado.options import define,options,parse_command_line define('port',default=8888,help='run on the port',type=int)
database=torndb.Connection('localhost','talk',user='root',password='ll')
l=[]
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.render('a.html',title='haha',items=l)
def post(self):
count=1
print(self.request.remote_ip)
talk=self.get_argument('talk')
talk=str(talk)
database.execute('insert into chatting(id,content) values(%d,"%s")'%(count,talk))
l.append(talk)
self.render('a.html',title='haha',items=l)
def main():
parse_command_line()
app=tornado.web.Application(
[
(r'/',MainHandler),
],
) app.listen(options.port)
tornado.ioloop.IOLoop.instance().start() if __name__=='__main__':
main()
相关教程:http://docs.jinkan.org/docs/flask/views.html
Flask即插视图与tornado比较的更多相关文章
- flask 即插视图(Pluggable Views)和endpoint
endpoint经常使用flask的人肯定不会面生.其实我一直没有关注过他是怎么寻址的,直到最近经常食用url_for这个函数才引起了我的注意. url_for看源码感觉实现挺复杂的,我们姑且不在这里 ...
- python Flask框架CBV视图
1.演示之前需要先写一个装饰器 # 装饰器 def wrapper(func): def inner(*args, **kwargs): print('操作函数%s之前' % func.__name_ ...
- Flask基础(06)-->视图常用逻辑
Flask基础(06)-->视图常用逻辑 返回json 重定向:url_for 自定义状态码 返回json:在使用 Flask 写一个接口时候需要给客户端返回 JSON 数据,在 Flask 中 ...
- flask 可插拔视图
Flask 0.7 版本引入了可插拨视图.可插拨视图基于使用类来代替函数,其灵感来自于 Django 的通用视图.可插拨视图的主要用途是用可定制的.可插拨的视图来替代部分 实现.普通的函数视图 演示代 ...
- flask路由和视图和cookie
什么是路由 """ 客户端(例如web浏览器)把请求发送给Web服务器,Web服务器再把请求发送给Flask程序实例. 程序实例需要知道对每个URL请求运行那些代码,所以 ...
- 1.Flask URL和视图
1.1.第一个flask程序 from flask import Flask #创建一个Flask对象,传递__name__参数进去 app = Flask(__name__) #url与视图映射 @ ...
- flask第一章 flask启动 路由视图 FlaskRequest jinja2 FlaskSession
一.简单了解flask web框架 优点: 小而精,组件只有session,第三方机构强烈支持flask,极其简单 缺点: 由于第三方软件的关系,稳定性相对较差,flask-session 扩展知识: ...
- Python框架学习之Flask中的视图及路由
在前面一讲中我们学习如何创建一个简单的Flask项目,并做了一些简单的分析.接下来在这一节中就主要来讲讲Flask中最核心的内容之一:Werkzeug工具箱.Werkzeug是一个遵循WSGI协议的P ...
- flask 路由和视图
路由设置的俩种方式 @app.route('/xxx') def index(): return 'index' ------------------------------------------ ...
随机推荐
- 设计模式—模板方法(template method)
一.定义 百度百科给的定义:定义一个操作中的算法骨架(稳定),而将一些步骤延迟到子类中(变化).Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 如何做到 ...
- 测试miniconda,python以及机器学习包是否安装成功
1.测试安装版本 conda -V python -V 2.安装的命令 (1)库升级和安装 升级全部库: conda upgrade --all [不知道为什么,我的conda install nu ...
- Python基础:九、运算符
一.赋值运算 简单的赋值运算符号:= c = a + b #将a+b的元算结果赋值给c 加法赋值运算符:+= c += a #等效于 c = c + a 减法赋值运算符:-= c -= a #等效于 ...
- IDT表连接
一.table A为基础表,左外连接table B,若要限制B的条件,需加(+),否则会对结果集以B表的条件进行过滤. DWD_REASON_CODE.CODE(+)=DWR_EDA_CL_TST_D ...
- Linux第七节课学习笔记
RHEL7用户身份有以下这些: 1.管理员 root UID:0 权限最大: 2.系统用户 UID:1-999: 3.普通用户 UID:1000+. 一个用户基本组只有一个,扩展组可多个,创建扩展组用 ...
- .Net牛刀小试-1缓冲使用
根据文件名缓冲文件: /// <summary> /// 根据文件名缓冲指定目录文件 /// </summary> public class FileCacheAdapter ...
- Java扩展方法之SPI
API:API(Application Programming Interface)表示应用程序编程接口 SPI:SPI(Service Provider Interface)表示服务提供商接口 A ...
- 学习3DES加密算法笔记
3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES加密算法.由于计 ...
- MQ实战
MQ是什么? MQ(消息队列)是一种跨进程的通信机制,用于上下游传递消息. MQ的优点 异步处理,代码解藕. spring中集成MQ的实现 1. xml配置 <?xml version=&quo ...
- 【转】Linux环境进程间通信(五) 共享内存(上)
转自:https://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index1.html 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以 ...