繁体   English   中英

Flask 表单 POST 请求以填充 jinja2 模板的 rest

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM