Antworten:
Ein anderer Weg ist zu schreiben
@user.route('/<user_id>', defaults={'username': None})
@user.route('/<user_id>/<username>')
def show(user_id, username):
pass
Aber ich denke, Sie möchten eine einzelne Route schreiben und username
als optional markieren ? Wenn das der Fall ist, denke ich nicht, dass es möglich ist.
Fast das gleiche wie Audrius vor einigen Monaten, aber vielleicht finden Sie es mit den Standardeinstellungen im Funktionskopf etwas besser lesbar - so wie Sie es von Python gewohnt sind:
@app.route('/<user_id>')
@app.route('/<user_id>/<username>')
def show(user_id, username='Anonymous'):
return user_id + ':' + username
username
nicht konstant ist. defaults=
friert den Standardwert in einem Wörterbuch ein.
@user.route('/<userId>/') # NEED '/' AFTER LINK
@user.route('/<userId>/<username>')
def show(userId, username=None):
pass
https://flask.palletsprojects.com/de/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
Fast das gleiche wie Skornos, jedoch mit variablen Deklarationen für eine explizitere Antwort. Es kann mit der Flask-RESTful-Erweiterung funktionieren :
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()
Die add_resource
Methode ermöglicht die Übergabe mehrerer URLs. Jeder wird an Ihre Ressource weitergeleitet .
Ich weiß, dass dieser Beitrag wirklich alt ist, aber ich habe an einem Paket namens flask_optional_routes gearbeitet, das dies tut. Der Code befindet sich unter: 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)
Sie können schreiben, wie Sie im Beispiel zeigen, aber dann erhalten Sie einen Build-Fehler.
Um dies zu beheben:
<Rule '/<userId>/<username>' (HEAD, POST, OPTIONS, GET) -> user.show_0>
und
<Rule '/<userId>' (HEAD, POST, OPTIONS, GET) -> .show_1>
{{ url_for('.show_0', args) }}
und{{ url_for('.show_1', args) }}
Seit Flask 0.10 können Sie einem Endpunkt nicht mehrere Routen hinzufügen. Sie können jedoch einen gefälschten Endpunkt hinzufügen
@user.route('/<userId>')
def show(userId):
return show_with_username(userId)
@user.route('/<userId>/<username>')
def show_with_username(userId,username=None):
pass
Ich denke, Sie können Blueprint verwenden, und dadurch sieht Ihr Code besser und ordentlicher aus.
Beispiel:
from flask import Blueprint
bp = Blueprint(__name__, "example")
@bp.route("/example", methods=["POST"])
def example(self):
print("example")