如何使用 Flask 处理输入字段中的特定用户错误

问题描述 投票:0回答:1

我正在为我的抓取工具做一个网站。在该网站上,我有三个输入字段(第二个是可选的)。如果用户未在第一个或第三个字段中输入任何内容,则会显示如下消息:

输入城市名称但未输入最后一个字段后,相同的消息将出现在最后一个字段中。

我想进行处理,以便用户无法在最后一个字段中输入除“wohnung”或“haus”之外的任何内容。我已经为其编写了代码,但它不起作用。如果用户在字段中输入任何内容,则表明抓取已开始,如下图所示:

因此,如果用户输入除上述单词之外的任何内容,我希望它显示出来,就像他们什么也没写一样。

处理输入字段的函数如下:

def run_scraper(city, subregion, apart_or_house):
    # Ask the user for input
    base_url = ""
    while True:
        if city != "":
            break
        else:
            flash("City name cannot be empty. Please enter a valid city name.", "error")
            return

    while True:
        if apart_or_house == "wohnung" or apart_or_house == 'haus':
            break
        elif apart_or_house == "":
            flash("This field cannot be empty. Please enter what are you buying.", "error")
        else:
            flash("Please enter either 'wohnung' or 'haus'.", "error")
            return

    if subregion:
        base_url = f"https://www.immobilienscout24.de/Suche/de/{city}/{city}/{subregion}/{apart_or_house}-kaufen"
    else:
        base_url = f"https://www.immobilienscout24.de/Suche/de/{city}/{city}/{apart_or_house}-kaufen"

    #Run the scraper script with the provided inputs and base_url
    subprocess.run(['python', 'scraper.py', city, subregion, apart_or_house, base_url])
    session['scraping_finished'] = True
    flash('Scraper has finished!', 'info')
    g.scraping_finished = True

调用的路由代码如下:

@app.route('/scrape', methods=['GET', 'POST'])
def scrape():
    form = ScrapingForm()
    if form.validate_on_submit():
        city = request.form.get('city')
        subregion = request.form.get('subregion')
        apart_or_house = request.form.get('apart_or_house')

        if city and apart_or_house:
            g.scraping_finished = False
            threading.Thread(target=run_scraper, args=(city, subregion, apart_or_house)).start()
            flash('Scraping started!', 'success')
        else:
            flash('Please fill all required fields.', 'error')

    if g.get('scraping_finished', False):
        flash('Scraper has finished!', 'info')

    return render_template('scrape.html', form=form)
python html flask
1个回答
0
投票

如果您想限制在公寓或房屋之间的选择,您可以使用您的表格。这消除了后续验证的需要。

class ScrapingForm(FlaskForm):
    city = StringField('City', 
        validators=[DataRequired()]
    )
    subregion = StringField('Subregion', 
        validators=[Optional()]
    )
    apart_or_house = SelectField('Buying', 
        choices=[('wohnung', 'Apartment'), ('haus', 'House')], 
    )
@app.route('/scrape', methods=['GET', 'POST'])
def scrape():
    form = ScrapingForm(request.form)
    if form.validate_on_submit():
        city = form.city.data
        subregion = form.subregion.data 
        apart_or_house = form.apart_or_house.data
        threading.Thread(target=run_scraper, args=(city, subregion, apart_or_house)).start()
        # ...
    return render_template('scrape.html', **locals())
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title></title>
</head>
<body>
    <form method="POST">
        {{ form.hidden_tag() }}
        <div>
            {{ form.city.label() }}
            {{ form.city() }}
            {% if form.city.errors -%}
                <ul>
                    {% for error in form.city.errors -%}
                    <li>{{ error }}</li>
                    {% endfor -%}
                </ul>
            {% endif -%}
        </div>
        <div>
            {{ form.subregion.label() }}
            {{ form.subregion() }}
            {% if form.subregion.errors -%}
                <ul>
                    {% for error in form.subregion.errors -%}
                    <li>{{ error }}</li>
                    {% endfor -%}
                </ul>
            {% endif -%}
        </div>
        <div>
            {{ form.apart_or_house.label() }}
            {{ form.apart_or_house() }}
            {% if form.apart_or_house.errors -%}
                <ul>
                    {% for error in form.apart_or_house.errors -%}
                    <li>{{ error }}</li>
                    {% endfor -%}
                </ul>
            {% endif -%}
        </div>
        <button type="submit">Submit</button>
    </form>
</body>
</html>
© www.soinside.com 2019 - 2024. All rights reserved.