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

0 投票
1 回答
49 浏览
提问于 2025-04-13 13:45

我正在为我的爬虫程序做一个网站。在这个网站上,我有三个输入框(第二个是可选的)。如果用户在第一个或第三个输入框里什么都不填,就会出现这样的提示信息:

在这里输入图片描述

当你输入了城市名称,但没有填最后一个输入框时,最后一个输入框也会出现同样的提示信息。

我想限制用户在最后一个输入框里只能输入“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)

1 个回答

1

如果你想在公寓和房子之间做个选择,可以用你的表单来限制这个选择。这样就不需要后续再进行验证了。

from flask_wtf import FlaskForm
from wtforms import StringField, SelectField
from wtforms.validators import DataRequired, Optional
from wtforms.widgets import CheckboxInput

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>

撰写回答