Respuestas:
Otra forma es escribir
@user.route('/<user_id>', defaults={'username': None})
@user.route('/<user_id>/<username>')
def show(user_id, username):
pass
Pero supongo que quieres escribir una sola ruta y marcarla username
como opcional. Si ese es el caso, no creo que sea posible.
Casi lo mismo que Audrius cocinó hace unos meses, pero puede que le resulte un poco más legible con los valores predeterminados en el cabezal de la función, la forma en que está acostumbrado con python:
@app.route('/<user_id>')
@app.route('/<user_id>/<username>')
def show(user_id, username='Anonymous'):
return user_id + ':' + username
username
no es constante. defaults=
congela el valor predeterminado en un diccionario.
@user.route('/<userId>/') # NEED '/' AFTER LINK
@user.route('/<userId>/<username>')
def show(userId, username=None):
pass
https://flask.palletsprojects.com/en/1.1.x/quickstart/#unique-urls-redirection-behavior
@app.route('/', defaults={'path': ''})
@app.route('/< path:path >')
def catch_all(path):
return 'You want path: %s' % path
@user.route('/<user_id>', defaults={'username': default_value})
@user.route('/<user_id>/<username>')
def show(user_id, username):
#
pass
Casi lo mismo que skornos, pero con declaraciones variables para una respuesta más explícita. Puede funcionar con la extensión Flask-RESTful :
from flask import Flask
from flask_restful import Resource, Api
app = Flask(__name__)
api = Api(app)
class UserAPI(Resource):
def show(userId, username=None):
pass
api.add_resource(UserAPI, '/<userId>', '/<userId>/<username>', endpoint='user')
if __name__ == '__main__':
app.run()
El add_resource
método permite pasar múltiples URL. Cada uno se enrutará a su Recurso .
Sé que esta publicación es muy antigua, pero trabajé en un paquete que hace esto llamado flask_optional_routes. El código se encuentra en: https://github.com/sudouser2010/flask_optional_routes .
from flask import Flask
from flask_optional_routes import OptionalRoutes
app = Flask(__name__)
optional = OptionalRoutes(app)
@optional.routes('/<user_id>/<user_name>?/')
def foobar(user_id, user_name=None):
return 'it worked!'
if __name__ == "__main__":
app.run(host='0.0.0.0', port=5000)
Puede escribir como muestra en el ejemplo, pero luego obtiene un error de compilación.
Para arreglar esto:
<Rule '/<userId>/<username>' (HEAD, POST, OPTIONS, GET) -> user.show_0>
y
<Rule '/<userId>' (HEAD, POST, OPTIONS, GET) -> .show_1>
{{ url_for('.show_0', args) }}
y{{ url_for('.show_1', args) }}
Desde Flask 0.10 no puede agregar múltiples rutas a un punto final. Pero puedes agregar puntos finales falsos
@user.route('/<userId>')
def show(userId):
return show_with_username(userId)
@user.route('/<userId>/<username>')
def show_with_username(userId,username=None):
pass