플라스크에 선택적 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 install flask_optional_routes를 사용해 볼 수 있습니다. b / c를 요청하는 기능에 대한 pip를 만들었습니다. 코드는 github.com/sudouser2010/flask_optional_routes에 있습니다.
sudouser2010

공감! 홈페이지에 각 탭이 / one / two / three / four와 같은 것을 트리거하는 여러 개의 탭이 있고 페이지를 다시로드하지 않고 동일한 페이지에 다른 컨텐츠를로드하려는 경우 단일 경로 또는 다중 경로를 사용해야합니까?
PirateApp

플라스크만으로는 달성 할 수없고 순전히 프론트 엔드 기능인
@PirateApp

183

몇 달 전에 Audrius가 요리 한 것과 거의 동일하지만 파이썬에서 익숙한 방식으로 함수 헤드의 기본값으로 약간 더 읽기 쉽습니다.

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

3
또한 username상수가 아닌 경우에도 작동합니다 . defaults=사전에서 기본값을 고정합니다.
kasperhj

2
나는 이것을 선호합니다. 코드를 최대한 깨끗하게 유지해야합니다.
Light.G

여기에는 큰주의 사항이 있습니다. 여러 개의 위치 인수가 있고 모두 선택 사항이 아닌 경우 플라스크는 URL을 올바르게 작성하는 방법을 이해하지 못합니다. / foo / page 여야하는 / page? arg = foo와 같은 것을 얻을 수 있습니다. @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
해당 링크가 더 이상 유효하지 않으면 답변이 손상되므로 외부 링크의 정보를 여기에 추가해야합니다.
tomab

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. 루트 .py에 app.url_map ()을 인쇄하십시오.
  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를 사용할 수 있다면 ur 코드가 더 좋고 깔끔하게 보일 것입니다.

예:

from flask import Blueprint

bp = Blueprint(__name__, "example")

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

이것은 질문에 대답하지 않습니다.
meyer9
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.