博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Flask即插视图与tornado比较
阅读量:5888 次
发布时间:2019-06-19

本文共 3644 字,大约阅读时间需要 12 分钟。

 

由于公司使用了Tornado框架和Flask框架,之前一直使用的都是Flask框架,已经对url下面紧跟着视图的写法很固执。刚开始接触Tornado框架,对于其url和视图分开的写法思想上无法转变。今天看了Flask的源码和相关教程看到原来 Flask也可以写出和Tornado类似的代码结构--Flask即插视图。

代码如下:

from functools import wrapsfrom flask import Flask, requestfrom flask.views import MethodViewapp = 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 writeclass 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'为endpointapp.add_url_rule('/users', defaults={
'user_id': None}, view_func=user_view, methods=['GET']) # url:/users,GETapp.add_url_rule('/users', view_func=user_view, methods=['POST']) # url:users,POSTapp.add_url_rule('/users/
', view_func=user_view, methods=['GET', 'PUT', 'DELETE']) # url:users,POSTapp.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_decoratordef 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()

 

相关教程:

转载于:https://www.cnblogs.com/rgcLOVEyaya/p/RGC_LOVE_YAYA_830days.html

你可能感兴趣的文章
xfs 分区格式化
查看>>
洁净触手可得—LG WD-VH455D1洗衣机使用体验记
查看>>
[C#]回车键实现输入光标的切换及系统快捷键的屏蔽
查看>>
高效职业人的8大习惯
查看>>
机器学习数据集哪里找:最佳数据集来源盘点
查看>>
阿里敏捷教练:多团队开发一个产品的组织设计和思考
查看>>
java线程系列---synchronized详解
查看>>
EAServer 普通jsp网页中调用组件
查看>>
SQL SERVER 2008 Mirroring Error 1418
查看>>
Spring中Bean的初始化过程
查看>>
体验Spring3 MVC,替换Struts2
查看>>
sleep和wait区别
查看>>
asterisk meetme 会议实现
查看>>
Nginx反向代理 实现Web负载均衡
查看>>
Task调用的错误信息返回和IsFaulted状态获取
查看>>
php 抽象类学习
查看>>
XP中超级终端使用方法
查看>>
Java的>>和>>>
查看>>
互联网项目成功上线背后的真相
查看>>
Python学习笔记整理(八)Python语句简介
查看>>