如何在Flask中处理输入字段的特定用户错误
我正在为我的爬虫程序做一个网站。在这个网站上,我有三个输入框(第二个是可选的)。如果用户在第一个或第三个输入框里什么都不填,就会出现这样的提示信息:
当你输入了城市名称,但没有填最后一个输入框时,最后一个输入框也会出现同样的提示信息。
我想限制用户在最后一个输入框里只能输入“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>