[英]Flask form POST request to populate rest of jinja2 template
我有一个使用自由文本输入字段“搜索成员”的 Flask web 表单。 我想使用诸如curl
之类的命令行工具以编程方式对该网站进行负载测试,而不是使用 Selenium 之类的用户行为来代替 mocking 用户行为。
这是 Python 后端:
# test.py
from time import sleep
from flask import Flask, render_template
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired
class Config:
SECRET_KEY = 'SUPER_SECRET_VALUE'
app = Flask(__name__)
app.config.from_object(Config)
class TestForm(FlaskForm):
member_id = StringField('Member ID', validators=[DataRequired()])
submit = SubmitField('Submit')
@app.route('/test', methods=['GET', 'POST'])
def test():
form = TestForm()
if form.validate_on_submit():
member_id_field = form.member_id
member_id = member_id_field.data
# simulate doing something with `member_id`
sleep(2)
result = 'some result'
return render_template(
'test.html',
title='test',
form=form,
result=result
)
else:
return render_template(
'test.html',
title='test',
form=form
)
if __name__ == '__main__':
app.run()
这是 HTML 表格:
<h1>Search for a member</h1>
<form action="" method="post" novalidate>
{{ form.hidden_tag() }}
<p>
{{ form.member_id.label }}
<br>
{{ form.member_id(size=32) }}
</p>
<p>{{ form.submit() }}</p>
{% if result is defined %}
<h1>Result is: {{ result }}</h1>
{% endif %}
</form>
首先,我用python3 test.py
启动服务器,然后使用curl -X POST -H "Content-Type: application/json" -d '{"member_id":"123"}' http://127.0.0.1:5000/test/
尝试将成员 ID 发送到表单以触发搜索逻辑。
如果我 go 在浏览器中访问网站,我可以输入一个 ID, Result is:
部分填充。 但是,使用curl
,我没有得到任何回报:
<h1>Search for a member</h1>
<form action="" method="post" novalidate>
<input id="csrf_token" name="csrf_token" type="hidden" value="BASDHSAHSADHASHDASHDAHSDH">
<p>
<label for="member_id">Member ID</label>
<br>
<input id="member_id" name="member_id" required size="32" type="text" value="123">
</p>
<p><input id="submit" name="submit" type="submit" value="Submit"></p>
如果Result is:
填充,我知道我的表单正在工作。 因此,使用网站方法有效,但命令行无效。 可能是什么问题?
这不是最佳解决方案,因为它不考虑 jinja 渲染时间,但您可以添加一层flask_restful
,为核心数据处理部分开发 REST API:
from time import sleep
from flask import Flask, render_template, request
from flask_wtf import FlaskForm
from flask_restful import Api, Resource
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired
class Config:
SECRET_KEY = 'SUPER_SECRET_VALUE'
def get_data(member_id):
sleep(2)
return f'getting data for {member_id}'
class TestForm(FlaskForm):
member_id = StringField('Member ID', validators=[DataRequired()])
submit = SubmitField('Submit')
class TestApi(Resource):
def get(self):
data = request.get_json(force=True)
get_data(data)
return data, 200
def post(self):
data = request.get_json(force=True)
get_data(data)
return data, 200
app = Flask(__name__)
app.config.from_object(Config)
api_manager = Api(app)
api_manager.add_resource(TestApi, '/api/test')
@app.route('/test', methods=['GET', 'POST'])
def test():
form = TestForm()
if form.validate_on_submit():
member_id_field = form.member_id
member_id = member_id_field.data
# simulate doing something with `member_id`
data = get_data(member_id)
return render_template(
'test.html',
form=form,
result=data
)
else:
return render_template(
'test.html',
form=form
)
if __name__ == '__main__':
app.run()
然后使用:
curl -X POST -H "Content-Type: application/json" -d '{"member_id":"123"}' http://127.0.0.1:5000/api/test
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.