IT story

플라스크에 선택적 URL 매개 변수가 있습니까?

hot-time 2020. 4. 29. 08:10
반응형

플라스크에 선택적 URL 매개 변수가 있습니까?


플라스크 URL 선택적 매개 변수를 직접 선언 할 수 있습니까?

현재 다음과 같은 방법으로 진행 중입니다.

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

이것이 username선택 사항 이라고 직접 말할 수 있습니까?


다른 방법은 쓰는 것입니다

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

그러나 단일 경로를 작성하고 username선택 사항으로 표시 하고 싶습니까? 그 경우라면 가능하지 않다고 생각합니다.


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

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

나처럼 Flask-Restful을 사용하는 경우 다음과 같은 방법으로도 가능합니다.

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

그런 다음 리소스 클래스에서

class UserAPI(Resource):

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

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

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


@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


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

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. 루트 .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) }}

이 게시물이 실제로 오래되었다는 것을 알고 있지만 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)

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

I think you can use Blueprint and that's will make ur code look better and neatly.

example:

from flask import Blueprint

bp = Blueprint(__name__, "example")

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

참고URL : https://stackoverflow.com/questions/14032066/can-flask-have-optional-url-parameters

반응형