在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宁愿所有路线都是独一无二的,所以我只是想知道这种情况是否完全可能存在。
答案 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'