Чи може колба мати необов’язкові параметри URL-адреси?


258

Чи можна безпосередньо оголосити необов'язковий параметр URL-адреси колби?

В даний час я дію таким чином:

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

Як я можу прямо сказати, що usernameце необов’язково?

Відповіді:


341

Інший спосіб - писати

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

Але я здогадуюсь, що ви хочете написати єдиний маршрут і позначити usernameяк необов’язковий? Якщо це так, я не думаю, що це можливо.


Будь-які проблеми із використанням цього методу при посиланні на кінцеві точки та url_for?

2
Не те, що я знаю. Навіть колби документи містять подібний приклад (вам потрібно прокрутити вниз трохи , щоб побачити його).
Audrius Kažukauskas

1
Ви можете спробувати встановити файл pip flask_optional_routes. Я створив піп-функцію для функцій, які ви запитуєте на b / c, і мені він потрібен. Код знаходиться за адресою: github.com/sudouser2010/flask_optional_routes .
sudouser2010

прихильне! якщо на вашій домашній сторінці є кілька вкладок, де кожна запускає щось на кшталт / одна / дві / три / чотири, і ви хочете завантажувати різний вміст на одну і ту ж сторінку, не завантажуючи сторінку, чи варто використовувати один маршрут або кілька маршрутів?
PirateApp

@PirateApp, якого неможливо досягти просто Flask і є суто функцією frontend
qaisjp

183

Майже те саме, що приготував Аудріус кілька місяців тому, але вам може здатися, що це трохи читабельніше за замовчуванням у функції функції - як ви звикли з python:

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

3
Крім того, це працює, якщо usernameне є постійним. defaults=заморожує значення за замовчуванням у словнику.
kasperhj

2
Я віддаю перевагу цьому. Ми повинні зберігати код максимально чистим.
Світло.Г

Майте на увазі, що тут є великий застереження: якщо у вас є декілька позиційних аргументів і не всі вони необов'язкові, колба не зрозуміє, як правильно створити URL-адресу. Ви можете отримати щось на зразок / page? Arg = foo там, де має бути / foo / page. @Audrius Kažukauskas відповідь працює в тому випадку, але це не так
rgargente

73

Якщо ви використовуєте Flask-Restful, як я, можливо також таким чином:

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

а потім у вашому класі ресурсів:

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
Ви повинні додати сюди інформацію із зовнішнього посилання, оскільки якщо це посилання більше не буде дійсним, ваша відповідь буде пошкоджена.
томаб

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

5

Майже те саме, що і skornos, але зі змінними оголошеннями для більш чіткої відповіді. Він може працювати з розширенням Flask-RESTful :

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_resourceМетод дозволяє прохід кратні URL. Кожен з них буде перенаправлений до вашого ресурсу .


1

Я знаю, що ця публікація справді стара, але я працював над пакунком, який називається flask_optional_routes. Код розміщений за адресою: 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

Ви можете писати так, як ви показуєте в прикладі, але ніж ви отримуєте помилку збирання.

Для виправлення цього:

  1. друкуйте app.url_map () у вашому корені .py
  2. ви бачите щось на кшталт:

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

і

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

  1. ніж у шаблоні ви можете {{ url_for('.show_0', args) }}і{{ url_for('.show_1', args) }}

-6

Оскільки Flask 0.10, ви не можете додати кілька маршрутів до однієї кінцевої точки. Але ви можете додати підроблену кінцеву точку

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

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

5
Що? Використовуючи колбу 0.10.1 тут, і я можу добре додати кілька маршрутів до однієї кінцевої точки.
jaapz

-8

Я думаю, ви можете використовувати Blueprint, і це зробить ур-код краще і акуратніше.

приклад:

from flask import Blueprint

bp = Blueprint(__name__, "example")

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

Це не дає відповіді на запитання.
meyer9
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.