Risposte:
Un altro modo è scrivere
@user.route('/<user_id>', defaults={'username': None})
@user.route('/<user_id>/<username>')
def show(user_id, username):
pass
Ma suppongo che tu voglia scrivere un singolo percorso e contrassegnarlo username
come facoltativo? In tal caso, non credo sia possibile.
Quasi lo stesso di Audrius inventato alcuni mesi fa, ma potresti trovarlo un po 'più leggibile con le impostazioni predefinite nell'intestazione della funzione - il modo in cui sei abituato con Python:
@app.route('/<user_id>')
@app.route('/<user_id>/<username>')
def show(user_id, username='Anonymous'):
return user_id + ':' + username
username
non è costante. defaults=
blocca il valore predefinito in un dizionario.
@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
Quasi uguale a skornos, ma con dichiarazioni variabili per una risposta più esplicita. Può funzionare con l' estensione 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()
Il add_resource
metodo consente di passare URL multipli. Ognuno verrà indirizzato alla tua risorsa .
So che questo post è davvero vecchio ma ho lavorato su un pacchetto che fa questo chiamato flask_optional_routes. Il codice si trova all'indirizzo: 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)
Puoi scrivere come mostrato nell'esempio, ma poi ottieni errore di compilazione.
Per risolvere questo problema:
<Rule '/<userId>/<username>' (HEAD, POST, OPTIONS, GET) -> user.show_0>
e
<Rule '/<userId>' (HEAD, POST, OPTIONS, GET) -> .show_1>
{{ url_for('.show_0', args) }}
e{{ url_for('.show_1', args) }}
Da Flask 0.10 non è possibile aggiungere più route a un endpoint. Ma puoi aggiungere un endpoint falso
@user.route('/<userId>')
def show(userId):
return show_with_username(userId)
@user.route('/<userId>/<username>')
def show_with_username(userId,username=None):
pass
Penso che tu possa usare Blueprint e questo renderà il tuo codice aspetto migliore e ordinato.
esempio:
from flask import Blueprint
bp = Blueprint(__name__, "example")
@bp.route("/example", methods=["POST"])
def example(self):
print("example")