2

在 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 宁愿所有路线都是独一无二的,所以我只是想知道这是否可能以某种形式出现。

4

3 回答 3

1

在烧瓶中有一个叫做请求的对象。在请求中,有一个名为 args 的字典,在该字典中有一个 next 属性。下一个属性允许您进入新的上下文。上下文是一个堆栈,因此您可以随意推送和弹出它们。如果您想使用标准重定向,您可以这样说。

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
于 2013-09-07T01:36:37.873 回答
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 --

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

于 2013-09-07T10:30:19.343 回答
0

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

from app import app
from functools import wraps
from flask import request

def primary_handler(f):
    wraps(f)
    def wrapper(*args, **kwargs):
        if request.get("orly") == "1":
            return "yarly"
        return f(*args, **kwargs)
    return wrapper

@app.route('/')
@primary_handler
def secondary_handler():
    return 'nowai'
于 2020-08-21T16:28:01.033 回答