Flask'ın isteğe bağlı URL parametreleri olabilir mi?


258

Bir şişe URL isteğe bağlı parametresini doğrudan bildirmek mümkün mü?

Şu anda şu şekilde devam ediyorum:

@user.route('/<userId>')
@user.route('/<userId>/<username>')
def show(userId, username=None):
    pass

Bunun usernameisteğe bağlı olduğunu nasıl doğrudan söyleyebilirim ?

Yanıtlar:


342

Başka bir yol yazmak

@user.route('/<user_id>', defaults={'username': None})
@user.route('/<user_id>/<username>')
def show(user_id, username):
    pass

Ama sanırım tek bir rota yazmak ve usernameisteğe bağlı olarak işaretlemek istiyorsunuz ? Eğer durum buysa, bunun mümkün olduğunu düşünmüyorum.


Uç noktalara ve url_for'a başvururken bu yöntemi kullanırken herhangi bir sorun var mı?

2
Bildiğim kadarıyla hayır. Flask belgeleri bile benzer bir örnek içerir (görmek için biraz aşağı kaydırmanız gerekir).
Audrius Kažukauskas

1
Pip install flask_optional_routes komutunu deneyebilirsiniz. Ben de ihtiyaç b / c talep işlevsellik için bir pip yarattı. Kod şurada bulunur: github.com/sudouser2010/flask_optional_routes .
sudouser2010

upvoted! ana sayfanızda, her birinin / bir / iki / üç / dört gibi bir şeyi tetiklediği birden fazla sekmeniz varsa ve sayfayı yeniden yüklemeden aynı sayfaya farklı içerik yüklemek istiyorsanız, tek bir rota mı yoksa birden fazla rota mu kullanmalısınız?
PirateApp

@PirateApp sadece Flask ile elde edilemez ve tamamen bir ön uç özelliği
qaisjp

183

Audrius'un birkaç ay önce pişirdiği ile hemen hemen aynı, ancak bunu işlev kafasındaki varsayılanlarla biraz daha okunabilir bulabilirsiniz - python ile alıştığınız şekilde:

@app.route('/<user_id>')
@app.route('/<user_id>/<username>')
def show(user_id, username='Anonymous'):
    return user_id + ':' + username

3
Ayrıca, bu usernamesabit değilse çalışır . defaults=sözlükteki varsayılan değeri dondurur.
kasperhj

2
Bunu tercih ederim. Kodu olabildiğince temiz tutmalıyız.
Işık

Burada büyük bir uyarı olduğunu unutmayın: birden fazla konumsal argümanınız varsa ve bunların tümü isteğe bağlı değilse, şişesi URL'nin nasıl düzgün bir şekilde oluşturulacağını anlamayacaktır. / Page? Arg = foo gibi bir şey / foo / page olmalıdır. @Audrius Kažukauskas cevap bu durumda çalışır, ancak bu
işe

73

Benim gibi Flask-Restful kullanıyorsanız, bu şekilde de mümkündür:

api.add_resource(UserAPI, '/<userId>', '/<userId>/<username>', endpoint = 'user')

a sonra Kaynak sınıfınızda:

class UserAPI(Resource):

  def get(self, userId, username=None):
    pass


11
@app.route('/', defaults={'path': ''})
@app.route('/< path:path >')
def catch_all(path):
    return 'You want path: %s' % path

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


3
Harici bağlantıdaki bilgileri buraya eklemelisiniz çünkü bu bağlantı artık geçerli olmayacaksa cevabınız zarar görecektir.
tomab

9
@user.route('/<user_id>', defaults={'username': default_value})
@user.route('/<user_id>/<username>')
def show(user_id, username):
   #
   pass

5

Skornos ile hemen hemen aynı, ancak daha açık bir cevap için değişken beyanlarla. Flask-RESTful uzantısı ile çalışabilir :

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()

add_resourceYöntem pas katları URL'ler sağlar. Her biri Kaynağınıza yönlendirilecektir .


1

Bu yazının gerçekten eski olduğunu biliyorum ama bunu flask_optional_routes adlı bir paket üzerinde çalıştım. Kod şu adreste bulunur: 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)

0

Örnekte gösterildiği gibi yazabilirsiniz, ancak derleme hatası alırsınız.

Bunu düzeltmek için:

  1. root .py'nizde app.url_map () yazdırın
  2. şuna benzer bir şey görürsünüz:

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

ve

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

  1. şablonda olduğundan {{ url_for('.show_0', args) }}ve{{ url_for('.show_1', args) }}

-6

Flask 0.10'dan beri bir uç noktaya birden fazla rota ekleyemezsiniz. Ama sahte uç nokta ekleyebilirsiniz

@user.route('/<userId>')
def show(userId):
   return show_with_username(userId)

@user.route('/<userId>/<username>')
def show_with_username(userId,username=None):
   pass

5
Ne? Burada şişeyi 0.10.1 kullanarak ve bir son noktaya çok sayıda yol ekleyebilirsiniz.
jaapz

-8

Ben Blueprint kullanabilirsiniz düşünüyorum ve bu ur kodu daha iyi ve düzgün görünmesini sağlayacaktır.

misal:

from flask import Blueprint

bp = Blueprint(__name__, "example")

@bp.route("/example", methods=["POST"])
def example(self):
   print("example")

Bu soruya cevap vermiyor.
meyer9
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.