Ist es möglich, einen optionalen Parameter für die Flaschen-URL direkt zu deklarieren?
Derzeit gehe ich folgendermaßen vor:
@user.route('/<userId>')
@user.route('/<userId>/<username>')
def show(userId, username=None):
.................
Gibt es irgendetwas, mit dem ich direkt sagen kann, dass "Benutzername" optional ist?
Ein anderer Weg ist das Schreiben
@user.route('/<user_id>', defaults={'username': None})
@user.route('/<user_id>/<username>')
def show(user_id, username):
pass
Aber ich denke, dass Sie eine einzige Route schreiben und username
als optional markieren möchten. Wenn das der Fall ist, glaube ich nicht, dass es möglich ist.
Fast das gleiche wie Audrius, das vor einigen Monaten zubereitet wurde, aber mit den Standardeinstellungen im Funktionskopf könnte es etwas lesbarer sein - 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
Wenn Sie Flask-Restful wie ich verwenden, ist dies auch folgendermaßen möglich:
api.add_resource(UserAPI, '/<userId>', '/<userId>/<username>', endpoint = 'user')
dann in Ihrer Ressourcenklasse:
class UserAPI(Resource):
def get(self, userId, username=None):
pass
@app.route('/', defaults={'path': ''})
@app.route('/< path:path >')
def catch_all(path):
return 'You want path: %s' % path
@user.route('/<userId>/') # NEED '/' AFTER LINK
@user.route('/<userId>/<username>')
def show(userId, username=None):
pass
@user.route('/<user_id>', defaults={'username': default_value})
@user.route('/<user_id>/<username>')
def show(user_id, username):
#
pass
Fast wie Skornos, aber mit variablen Deklarationen für eine explizitere Antwort. Es kann mit Flask-RESTful Erweiterung arbeiten :
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 __== '__main__':
app.run()
Mit der add_resource
-Methode können mehrere URLs übergeben werden. Jeder wird an Ihre Ressource weitergeleitet.
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) }}
Ich weiß, dass dieser Beitrag wirklich alt ist, aber ich habe an einem Paket gearbeitet, das dies als flask_optional_routes bezeichnet. 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 __== "__main__":
app.run(Host='0.0.0.0', port=5000)