Python 烧瓶-具有多个可选参数的布线

Python 烧瓶-具有多个可选参数的布线,python,flask,routes,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>') @app.route('/sea

我有一个名为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>')
@app.route('/search/pg/'))
@app.route(“/search/types/”)
@app.route(“/search/number/”)
@app.route(“/search/subject/”)
URL中的顺序应该无关紧要,因此我可以调用/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
@app.route('/search/pg//types//subject/',methods=['GET','POST']))
@app.route('/search/subject',默认值={'subject',None})
@app.route('/search/pg//types/',methods=['GET','POST'])
@app.route('/search/types',默认值={'types',None})
@app.route('/search',默认值={'pg':1},方法=['GET','POST'])
@app.route('/search/pg/',方法=['GET','POST'])
def搜索(pg,类型=无,主题=无):
通过

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

在flask view函数中,您可以从请求对象检索参数:

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

您可以在URL中使用筛选器而不是“子资源”。 然后,您可以在请求中按任意顺序放置搜索参数:
/search?pg=&types=

在flask view函数中,您可以从请求对象检索参数:

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

@大卫,我做过一个叫做flask_可选路径的包。代码位于:

从烧瓶导入烧瓶
从flask_可选路径导入可选路径
app=烧瓶(名称)
可选=可选路线(应用程序)
@可选。路由(“//?/”)
def foobar(用户id,用户名称=无):
返回“成功了!”
如果名称=“\uuuuu main\uuuuuuuu”:
应用程序运行(主机=0.0.0.0',端口=5000)

@David,我开发了一个名为flask\u optional\u routes的包。代码位于:

从烧瓶导入烧瓶
从flask_可选路径导入可选路径
app=烧瓶(名称)
可选=可选路线(应用程序)
@可选。路由(“//?/”)
def foobar(用户id,用户名称=无):
返回“成功了!”
如果名称=“\uuuuu main\uuuuuuuu”:
应用程序运行(主机=0.0.0.0',端口=5000)

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

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

请注意,
重定向(url\u 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创建之后选择了哪些表单值,因为单个路由同时拥有两种方法。

如果您试图基于多个方法路由用户,可选的表单值作为路由参数,然后我找到了一个有用的解决方法

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

请注意,
重定向(url\u 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之后,因为单一路由同时拥有这两种方法。

使用查询字符串并解析请求中的选项以生成查询使用查询字符串并解析请求中的选项以生成查询