由于公司使用了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比较的更多相关文章

  1. flask 即插视图(Pluggable Views)和endpoint

    endpoint经常使用flask的人肯定不会面生.其实我一直没有关注过他是怎么寻址的,直到最近经常食用url_for这个函数才引起了我的注意. url_for看源码感觉实现挺复杂的,我们姑且不在这里 ...

  2. python Flask框架CBV视图

    1.演示之前需要先写一个装饰器 # 装饰器 def wrapper(func): def inner(*args, **kwargs): print('操作函数%s之前' % func.__name_ ...

  3. Flask基础(06)-->视图常用逻辑

    Flask基础(06)-->视图常用逻辑 返回json 重定向:url_for 自定义状态码 返回json:在使用 Flask 写一个接口时候需要给客户端返回 JSON 数据,在 Flask 中 ...

  4. flask 可插拔视图

    Flask 0.7 版本引入了可插拨视图.可插拨视图基于使用类来代替函数,其灵感来自于 Django 的通用视图.可插拨视图的主要用途是用可定制的.可插拨的视图来替代部分 实现.普通的函数视图 演示代 ...

  5. flask路由和视图和cookie

    什么是路由 """ 客户端(例如web浏览器)把请求发送给Web服务器,Web服务器再把请求发送给Flask程序实例. 程序实例需要知道对每个URL请求运行那些代码,所以 ...

  6. 1.Flask URL和视图

    1.1.第一个flask程序 from flask import Flask #创建一个Flask对象,传递__name__参数进去 app = Flask(__name__) #url与视图映射 @ ...

  7. flask第一章 flask启动 路由视图 FlaskRequest jinja2 FlaskSession

    一.简单了解flask web框架 优点: 小而精,组件只有session,第三方机构强烈支持flask,极其简单 缺点: 由于第三方软件的关系,稳定性相对较差,flask-session 扩展知识: ...

  8. Python框架学习之Flask中的视图及路由

    在前面一讲中我们学习如何创建一个简单的Flask项目,并做了一些简单的分析.接下来在这一节中就主要来讲讲Flask中最核心的内容之一:Werkzeug工具箱.Werkzeug是一个遵循WSGI协议的P ...

  9. flask 路由和视图

    路由设置的俩种方式 @app.route('/xxx') def index(): return 'index' ------------------------------------------ ...

随机推荐

  1. FileUrl

    package com.rscode.credits.util; import java.io.BufferedReader; import java.io.File; import java.io. ...

  2. .Net中World转PDF

    using System;using System.Collections.Generic;using System.Linq;using System.Web;using Aspose.Words; ...

  3. memcache 杂记

    它是一个一个高性能的分布式内存对象缓存系统. 端口号 11211 目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的.  需要频繁访问数据库的网站访问速度提升效果十分显著 根据一个sql取出的 ...

  4. windows10环境下VMware14中Ubuntu16.04解决如何上网问题

    进入控制面板,网络和Internet,网络连接 点击以太网,查看详细信息 点击属性 --> 共享,允许其他网络-->选择VMnet1 点开虚拟机编辑选项 ,选择 VMNET1 仅主机,其他 ...

  5. Ex0203

    游戏 –     这些软件的开发者是怎么说服你(陌生人)成为他们的用户的?他们的目标都是盈利么?他们的目标都是赚取用户的现金么?还是别的? 朋友们都在玩,我在试玩的时候也觉得很不错:游戏基本上的目标都 ...

  6. sequelize 学习笔记

    使用 eggjs 和 sequelize 进行开发,一些要注意的地方 1.egg 的 egg-sequelize 插件是 sequelize 的V4版本,目前已经更新到V5版本,API有一些变化,比如 ...

  7. Actifio快照池(snapshot pool)空间占用说明

    快照池是什么? 快照池是根据定义的SLA(Service Level Agreement)来保存应用数据各时间点的黄金副本空间. 快照池空间的消耗 快照池空间由三种不同类型的虚拟磁盘使用: Stagi ...

  8. test markdown to html

    软件版本 PHP 5.5.25 Yaf 2.3.2 域名 正式域名 gm.mgame.qihoo.net demo域名 demo.gm.mgame.qihoo.net 配置 配置目录 后台配置 con ...

  9. 常规DP专题练习

    POJ2279 Mr. Young's Picture Permutations 题意 Language:Default Mr. Young's Picture Permutations Time L ...

  10. 集成direnv 与docker-compose 进行环境变量管理

    direnv 是一个不错的换将变量管理工具,同时日常的开发测试中我们使用docker-compose 会比较多,一般我们的玩法是 可以再docker-compose 中指定环境变量,可以通过envir ...