传递flask url的空/无参数(@ main.route /)

时间:2015-07-30 18:38:24

标签: python flask flask-sqlalchemy

我有以下代码从WTForm获取变量,用户可以在其中输入名称或ID,这将用于我的数据库中的查询。问题是当提交一个字段时URL会“中断”,例如,如果没有提交piname,则url看起来像'/ find_pi // 1424524'。有没有办法解决这个问题而不必分解代码?我的下一个任务涉及多个“可选”字段,这些字段将更难分解。

    @main.route('/find_pi/', methods=('GET', 'POST'))
    def pick_pi():
        form = PeopleFinder()
        if form.validate_on_submit():
            piname = form.piname.data
            piid = form.piid.data
            return redirect(url_for('.piresults', piname=piname, piid=piid)
        return render_template('specify_pi.html', form=form)

    @main.route('/find_pi/<piname>/<piid>')
    def find_pi(piname, piid):
        if piname != None:
            entries = Grant.query.filter(Grant.pi_name==(piname)).all()
            return render_template('piresults.html', entries=entries)
        if piid != None:
            entries = Grant.query.filter(Grant.pi_id==(piid)).all()
            return render_template('piresults.html', entries=entries)

谢谢!

1 个答案:

答案 0 :(得分:0)

如果您需要pinamepiid,有几种方法可以实现此目的:

1.单独路线

@main.route('find_pi/<str:piname>') 
def find_pi_by_name(piname):
    entries = Grant.query.filter(Grant.pi_name==(piname)).all()
    return render_template('piresults.html', entries=entries)

@main.route('find_pi/<int:piid>') # int ensures that piid is a number
def find_pi_by_id(piid):
    entries = Grant.query.filter(Grant.pi_id==(piid)).all()
    return render_template('piresults.html', entries=entries)

2.检查piname和piid

的单一路线
@main.route('/find_pi/<piname_or_piid>')
def find_pi(piname_or_piid):
    piid = None
    piname = None
    try:
       piid = int(piname_or_piid)
    except ValueError:
       piname = piname_or_piid
    if piname != None:
        entries = Grant.query.filter(Grant.pi_name==(piname)).all()
    elif piid != None:
        entries = Grant.query.filter(Grant.pi_id==(piid)).all()
    return render_template('piresults.html', entries=entries)

如果您计划添加其他可选参数,那么您应该使用查询字符串,基本网址不是放置可选元素的好地方。

相关问题