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.