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

本文共 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

你可能感兴趣的文章
c++ 函数声明
查看>>
linux下,免密码登录
查看>>
街道管理
查看>>
hdu 3501 Calculation 2 (欧拉函数)
查看>>
csv2mysql
查看>>
可以免费下载视频素材和模板网站汇总
查看>>
生成包含数字和大小写字母的随机码
查看>>
前辈回顾15年程序员生涯,总结的7点经验
查看>>
WebView与 JS 交互方式
查看>>
Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序
查看>>
【CT】四、Turing Machines(2)
查看>>
【matlab】plot
查看>>
Kafka生产者APi
查看>>
有关计算机组成的分享~
查看>>
梳理回顾
查看>>
基于开源Dubbo分布式RPC服务框架的部署整合
查看>>
用C#实现智能设备上的NotifyIcon类
查看>>
HDU-2602-Bone Collector
查看>>
vs 2017 IIS EXPRESS 增加局域网访问
查看>>
POJ-2456 Aggressive cows---最大化最小值(也就是求最大值)
查看>>