URL的管理参数(Python Flask)

2024-06-28 20:11:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在我的网站上有一些搜索功能。在输出页面中,我将在一个页面中获取所有结果。但是,我想将它分发到多个页面(即100个搜索/页面)。为此,我在“urlfor”中传递了一些默认搜索,但它不起作用。我知道我犯了一个小错误,但我没有抓住它。

下面是我的代码:

@app.route('/', methods=['GET', 'POST'])
def doSearch():
    entries=None
    error=None
    if request.method=='POST':
        if request.form['labelname']:
            return redirect(url_for('show_results',results1='0-100', labelname=request.form['labelname'] ))
        else:
            error='Please enter any label to do search'
    return render_template('index.html',entries=entries, error=error)




@app.route('/my_search/<labelname>')
def show_results(labelname=None, resultcount=None, results1=None):
    if not session.get('user_id'):
        flash('You need to log-in to do any search!')
        return redirect(url_for('login'))

    else:
        time1=time()
        if resultcount is None:
            total_count=g.db.execute(query_builder_count(tablename='my_data',nametomatch=labelname, isextension=True)).fetchall()[0][0]

        limit_factor=" limit %s ,%s"%(results1.split('-')[0],results1.split('-')[1])

        nk1=g.db.execute(query_builder(tablename='my_data',nametomatch=labelname, isextension=True) + limit_factor)
        time2=time()
        entries=[]
        maxx_count=None
        for rows in nk1:
            if maxx_count is None:
                maxx_count=int(rows[0])
            entries.append({"xmlname":rows[1],'xmlid':rows[2],"labeltext":rows[12]})
        return render_template('output.html', labelname=labelname,entries=entries, resultcount=total_count, time1=time2-time1, current_output=len(entries))

在这里,我想要URL上的输出,比如“http://127.0.0.1:5000/my_search/assets?results1=0-100” 另外,如果我在浏览器中编辑url地址,就像我想要下一个100结果一样,我可以在“http://127.0.0.1:5000/my_search/assets?results1=100-100”上得到它

注意:这里我使用sqlite作为后端;因此我将在查询中使用“limit_factor”来限制结果。“query_builder”和“query_builder_count”只是生成复杂sql查询的简单函数。

但是我得到的错误是“NoneType”不能有split。它在"limit_factor"停止。

这里限制因子只是我应用的一个过滤器;但是我想应用更多的过滤器,例如我想按它的位置“http://127.0.0.1:5000/my_search/assets?results1=0-100&location=asia”搜索


Tags: nonesearchreturnifmycountbuildererror
1条回答
网友
1楼 · 发布于 2024-06-28 20:11:59

函数参数只映射到路由变量。这意味着在您的例子中,show_results函数应该只有一个参数,即labelname。您甚至不必将其默认为None,因为它总是必须设置的(否则路由将不匹配)。

要获取查询参数,请使用^{}

from flask import request

@app.route('/my_search/<labelname>')
def show_results(labelname=None):
    results1 = request.args.get('results1', '0-100')
    ...

顺便说一句,最好不要像构建SQL那样使用占位符和变量。您的代码易受SQL injection攻击。您不能信任来自用户的任何输入。

正确的方法取决于实际的数据库,但是例如,如果您使用MySQL,您可以这样做(不是我没有使用%运算符):

sql = ".... LIMIT %s, %s"
g.db.execute(sql, (limit_offset, limit_count))

相关问题 更多 >