Regex с дополнительными косыми чертами в конечных точках Sanic - PullRequest
0 голосов
/ 20 сентября 2019

Я хочу сделать API REST с Sanic (https://github.com/huge-success/sanic), и я застрял с регулярными выражениями.

У меня есть эта конечная точка: api/foo/<string_with_or_without_slashes>/bar/<string>/baz

MyКод Python:

from sanic import Sanic                                                                                                                                                                  
from sanic.response import json                                                                                                                                                          

app = Sanic()                                                                                                                                                                            

@app.route('/api/foo/<foo_id:[^/].*?>/baz')                                                                                                                                              
async def test1(request, foo_id):                                                                                                                                                        
    return json({'test1': foo_id})                                                                                                                                                       

@app.route('/api/foo/<foo_id:[^/].*?>/bar/<bar_id>/baz')                                                                                                                                 
async def test2(request, foo_id, bar_id):                                                                                                                                                 
    return json({'test2': f'{foo_id}:{bar_id}'})                                                                                                                                         

if __name__ == '__main__':                                                                                                                                                               
    app.run(host='0.0.0.0', port=8000)          

Если я сделаю:

$ curl -i http://localhost:8000/api/foo/aa/bar/bb/baz
{"test1":"aa\/bar\/bb"} 

Или $ curl -i http://localhost:8000/api/foo/a/a/bar/bb/baz.

Он всегда называется test1, когда я хочу позвонить test2 функция.

Вы можете мне помочь? Большое спасибо! :) 1021 *

1 Ответ

1 голос
/ 23 сентября 2019

Оба маршрута соответствуют вашим тестовым запросам, и в качестве первого соответствующего маршрута используется (см. Эту проблему на GitHub ) test1 выполняется.

Поскольку ваш первый маршрут более общийчем ваш второй маршрут, вы можете просто определить test2 до test1:

from sanic import Sanic
from sanic.response import json

app = Sanic()

@app.route('/api/foo/<foo_id:[^/].*?>/bar/<bar_id>/baz')
async def test2(request, foo_id, bar_id):
    return json({'test2': f'{foo_id}:{bar_id}'})

@app.route('/api/foo/<foo_id:[^/].*?>/baz')
async def test1(request, foo_id):
    return json({'test1': foo_id})

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000)
...