Flask - 具有多个可选参数的路由

时间:2017-07-12 14:08:58

标签: python flask routes

我有一条名为search的路线:@ app.route('/ search') 是否可以为其添加多个可选参数?例如:

@app.route('/search/pg/<int:pg>')
@app.route('/search/types/<types>')
@app.route('/search/number/<int:number>')
@app.route('/search/subject/<subject>')

网址中的顺序无关紧要,所以我可以调用/ search / pg / 2,或/ search / subject / MySubject / pg / 2或/ search / types / posts / subject / MySubject / pg / 2

我尝试了这个,但它只适用于完整路径和所有参数:

@app.route('/search/pg/<int:pg>/types/<types>/subject/<subject>', methods=['GET', 'POST'])
@app.route('/search/subject', defaults={'subject', None})
@app.route('/search/pg/<int:pg>/types/<types>', methods=['GET', 'POST'])
@app.route('/search/types', defaults={'types', None})
@app.route('/search', defaults={'pg': 1}, methods=['GET', 'POST'])
@app.route('/search/pg/<int:pg>', methods=['GET', 'POST'])
def search(pg, types=None, subject=None):
    pass

3 个答案:

答案 0 :(得分:2)

您可以在网址中使用过滤器而不是“子资源”。 然后,您可以在请求中以任何顺序放置搜索参数: /search?pg=<pg>&types=<types>

在烧瓶视图功能中,您可以从请求对象中检索参数:

@app.route('/search/')
def search():
    pg = request.args.get('pg')
    ...

答案 1 :(得分:0)

@David,我参与了一个名为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)

答案 2 :(得分:0)

如果您尝试基于多个可选的 form 值作为路由参数来路由用户,那么我找到了一个有用的解决方法。

首先,创建一条中间路线,该路线将创建查询字符串。此路由仅允许使用POST方法(因为该表单将提交1个或多个表单值)。

@app.route('/example', methods=['POST']
def createQueryParams():
  form = ExampleForm()
  # Retrieve/cleanse/validate form data
  example1 = form.example_field1.data
  example2 = form.example_field2.data
  return redirect(url_for('app.route', example1=example1, example2=example2))  

请注意,redirect(url_for())中的每个关键字参数都必须是app.route中使用的参数,或者您希望将其添加为查询参数。

接下来,将您的app.route()更改为具有GET方法,并提取提到的@ lee-pai-long之类的查询参数

@app.route('/search', methods=['GET'])
def search():
  if len(request.args) > 0:
    example1 = request.args.get('example1')
    example2 = request.args.get('example2')
    # Do stuff

最后,在提交表单的.html模板中,确保表单操作定向到createQueryParams路由,而不是search路由。如

<form action="{{ url_for('app.createQueryParams') }}" method="POST">
  <!-- Flask form stuff -->
</form>

我使用这种结构创建了一个页面,用户可以在其中基于多达X个不同的条件(标题搜索,日期排序,标签等)过滤帖子。我希望能够有一个优化的查询参数,但是没有中介createQueryParams路由,直到创建url之后,我才能确定选择了哪种表单值,因为单个路由同时拥有这两种方法。 / p>