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

原文地址:https://www.cnblogs.com/rgcLOVEyaya/p/RGC_LOVE_YAYA_830days.html

时间: 2024-11-09 14:28:58

Flask即插视图与tornado比较的相关文章

网站后端_Python+Flask.0010.FLASK即插视图之自定义视图类及视图修饰?

即插视图; 说明: FLASK的视图灵感来自于DJANGO的基于类而非基于函数的通用视图,主要目的是为了解决多个视图函数之间已经实现的部分,通过类继承的方式继承到其它视图,总之为了一点,就是少写代码,然后通过add_url_rule让我们定义的视图类支持动态插入,也就是所谓的即插视图 深入视图: # 转换前: #!/usr/bin/env python # -*- coding: utf-8 -*- """ # # Authors: limanman # 51CTOBG: h

flask 即插视图(Pluggable Views)和endpoint

endpoint经常使用flask的人肯定不会面生.其实我一直没有关注过他是怎么寻址的,直到最近经常食用url_for这个函数才引起了我的注意. url_for看源码感觉实现挺复杂的,我们姑且不在这里纠结看到这一句: def url_for(endpoint, **values): """Generates a URL to the given endpoint with the method provided. 传入的第一个参数是endpoint,url_for函数会将挂在

flask路由和视图和cookie

什么是路由 """ 客户端(例如web浏览器)把请求发送给Web服务器,Web服务器再把请求发送给Flask程序实例. 程序实例需要知道对每个URL请求运行那些代码,所以保存了一个URL到Python函数的映射关系. 处理URL和函数之间关系的程序称之为路由. """ 看个简单完整的的例子 #!/usr/bin/env python # -*- coding:utf-8 -*- from flask import Flask app = Flas

Windows环境将Flask应用程序部署在tornado+nginx的简单方法

1.Flask的入口程序为manage.py,代码如下: #coding=utf-8#!/usr/bin/python from somewhere import app  #somewhere 表示的包含Flask的实例,如app = Flask(__name__) if __name__ == "__main__":     app.run(debug=True) 2.在manage.py的同级目录添加tornado应用程序tornado_server.py来托管manage.py

深入学习Flask框架之视图及路由

在前面一讲中我们学习如何创建一个简单的Flask项目,并做了一些简单的分析.接下来在这一节中就主要来讲讲Flask中最核心的内容之一:Werkzeug工具箱.Werkzeug是一个遵循WSGI协议的Python函数库.WSGI协议在前面的文章中也有提到(点我查看).那Werkzeug有什么作用呢?它其实实现了很多底层的东西,如Request.Response和集成URL请求路由等. 一.Werkzeug的组成: 二.routing模块 routing模块的主要目的是负责实现URL解析.不同的UR

Flask的路由,视图和相关配置

第一个flask程序 from flask import Flask Flask函数接收一个参数__name__,它会指向程序所在的包 app = Flask(__name__) 装饰器的作用是将路由映射到视图函数 index,在程序运行过程中,程序实例中会使用 url_map 将装饰器路由和视图的对应关系保存起来 @app.route('/') def index(): return 'Hello World' Flask应用程序实例的 run 方法 启动 WEB 服务器 if __name_

Flask框架:视图

1.视图中请求request的属性 request.method request.args request.form request.values request.cookies request.headers request.path request.full_path request.script_root request.url request.base_url request.url_root request.host_url request.host request.files obj

1.Flask URL和视图

1.1.第一个flask程序 from flask import Flask #创建一个Flask对象,传递__name__参数进去 app = Flask(__name__) #url与视图映射 @app.route('/') def hello_world(): return 'Hello World!' if __name__ == '__main__': app.run() #flask中的一个测试应用服务器 浏览器访问:http://127.0.0.1:5000/,也可以更改端口号:

flask快速入门笔记四_模板:分离数据与视图

首先声明:内容大部分来自huizhiwang,只是单纯记笔记. 1 模板引擎 在Flask中,视图函数的返回值为响应的正文被送往前端浏览器.毫无疑问,一个实用 的视图函数需要在服务端根据请求的不同动态构造这个内容.然而手工拼接一段冗长 的HTML串是乏味而且相当容易出错. 这正是模板引擎发挥威力的地方,只需要将模板和数据送入模板引擎,我们就告 别了那些那些拼接.转义之类的琐碎之事,轻松得到一个渲染后的字符串: