将控制传递给Flask中的不同处理程序(类似于Node.js Express)

时间:2013-09-06 14:01:06

标签: python flask

在Express.js中,人们可以这样做......

app.get('/users/:id?', function(req, res, next){
    var id = req.params.id;
    if (id) {
        // do something
    } else {
        next();
    }
});

...将控制权传递给中间件堆栈中的下一个匹配路由(如果找到)。

使用Python Flask可以实现这样吗?如果没有,那么实现类似的东西是什么?

修改

我原来的问题不明确。

var express = require('express');
var app = express();
var app2 = express();

app.use(app2.router);

app2.get('/', function(req, res, next) {
    if(req.query.orly){
        res.send('yarly.');
    }else{
        next();
    }
});

app.get('/', function(req, res, next) {
    res.send('nowai.');
});

app.listen(3000);

我想要实现的目标是:

curl localhost:3000
>>> nowai.
curl localhost:3000/?orly=1
>>> yarly.

这是一个简单的例子,但我正在寻找的基本能力是相同的:能够将控制传递给下一个匹配的路线。在提出问题之后,我发现Werkzeug宁愿所有路线都是独一无二的,所以我只是想知道这种情况是否完全可能存在。

3 个答案:

答案 0 :(得分:1)

In flask there is a object called request. In request, there is a dictionary called args and in that dictionary there is a next attribute.此下一个属性允许您移动到新的上下文。 Contexts are a stack, so you can push and pop them as you please.如果您想使用标准重定向,可以这样说。

from flask import request, url_for

def redirect_url():
    return request.args.get('next') or \
           request.referrer or \
           url_for('index')

您的代码翻译将如下所示。

from flask import request, url_for, _request_ctx_stack

@app.route('/user/<id>')
def users(id):
    if id:
        #do something 
    else:
        #Push onto _request_ctx_stack if you want to change the redirect
        return request.args.get('next') or \
           request.referrer

答案 1 :(得分:1)

Python非常明确。而且我想认为Flask非常像pythonic那样。我真正想说的是JS等价物不存在,因为它要求将相同的路由级联到2个不同的函数,这是不明确的。

但是,你可以在Flask / Python中做类似的事情:

@app.route('/', methods=['GET', 'POST'], defaults={'path': ''})
@app.route('/<path:path>', methods=['GET', 'POST'])
def catch_all(path):
    if request.get("orly") == "1":
         return "yarly"
    else catch_arbitary_path(path)

def catch_arbitary_path(path):
    pass
    #-- your code here --

不同之处在于,您声明了广泛的路由(基本上是所有内容),并在单个函数中处理它们,并根据路径将控制流级联到子函数。

答案 2 :(得分:0)

我认为Python装饰器可以在这种情况下工作:

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://username:password@server/db'