1. 程式人生 > >Flask即插檢視與tornado比較

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