wake-up-neo.com

Kann Flask optionale URL-Parameter haben?

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?

185
Noor

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.

243

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
146
mogul

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
53
skornos
@app.route('/', defaults={'path': ''})
@app.route('/< path:path >')
def catch_all(path):
    return 'You want path: %s' % path

http://flask.pocoo.org/snippets/57/

11
Sona
@user.route('/<userId>/')  # NEED '/' AFTER LINK
@user.route('/<userId>/<username>')
def show(userId, username=None):
    pass

http://flask.pocoo.org/docs/0.10/quickstart/#routing

8
iwasborntobleed
@user.route('/<user_id>', defaults={'username': default_value})
@user.route('/<user_id>/<username>')
def show(user_id, username):
   #
   pass
5
aman kumar

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.

0
yoelvis

Sie können schreiben, wie Sie im Beispiel zeigen, aber dann erhalten Sie einen Build-Fehler.

Um dies zu beheben:

  1. drucken Sie app.url_map () in Ihrem Stammverzeichnis .py
  2. du siehst so etwas wie:

<Rule '/<userId>/<username>' (HEAD, POST, OPTIONS, GET) -> user.show_0>

und

<Rule '/<userId>' (HEAD, POST, OPTIONS, GET) -> .show_1>

  1. als in der Vorlage können Sie {{ url_for('.show_0', args) }} und {{ url_for('.show_1', args) }}
0
lov3catch

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)
0
sudouser2010