Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何用“标记”标记烧瓶形状;“下一步”;按钮?_Python_Html_Flask_Flask Wtforms_Wtforms - Fatal编程技术网

Python 如何用“标记”标记烧瓶形状;“下一步”;按钮?

Python 如何用“标记”标记烧瓶形状;“下一步”;按钮?,python,html,flask,flask-wtforms,wtforms,Python,Html,Flask,Flask Wtforms,Wtforms,目前,使用Flask,我有一个主页,其中有一个(长)表单供用户填写。但是,我想把这个表单分成几块,然后用“下一步”按钮反复浏览(有点像你在网上买东西,需要浏览不同的页面来填写信息)。到目前为止,我已经尝试了以下方法: 在主页html中实现多个“提交”按钮: {% extends 'layout.html' %} {% block body %} <div class="content-section"> <form method="POST" acti

目前,使用Flask,我有一个主页,其中有一个(长)表单供用户填写。但是,我想把这个表单分成几块,然后用“下一步”按钮反复浏览(有点像你在网上买东西,需要浏览不同的页面来填写信息)。到目前为止,我已经尝试了以下方法:

在主页html中实现多个“提交”按钮:

{% extends 'layout.html' %}

{% block body %}
    <div class="content-section">
        <form method="POST" action="">
            {{ form.hidden_tag() }}
            <fieldset class="form-group">
                <legend class="border-bottom mb-4">Pipeline Input</legend>
                <div class="form-group required">
                    {{ form.stack_name.label(class="form-control-label") }}
                    {{ form.deploy_bucket(class="form-control form-control-lg") }}
                </div>
                <div class="form-group required">
                    {{ form.key_pair.label(class="form-control-label") }}
                    {{ form.key_pair(class="form-control form-control-lg") }}
                </div>
                <div class="form-group required">
                    {{ form.start_point.label(class="form-control-label") }}
                    {{ form.start_point(class="form-control form-control-lg") }}
                </div>
                <div class="form-group">
                    {{ form.qc.label(class="form-control-label") }}
                    {{ form.qc(class="form-control form-control-lg") }}
                </div>
                    {{ form.submit_1(class="btn btn-outline-info") }}
                <div class="form-group required">
                    {{ form.input_uri.label(class="form-control-label") }}
                    {{ form.input_uri(class="form-control form-control-lg") }}
                </div>
                <div class="form-group required">
                    {{ form.output_uri.label(class="form-control-label") }}
                    {{ form.output_uri(class="form-control form-control-lg") }}
                </div>
                <div class="form-group required">
                    {{ form.ref_uri.label(class="form-control-label") }}
                    {{ form.ref_uri(class="form-control form-control-lg") }}
                </div>
                <div class="form-group required">
                    {{ form.user_assets_uri.label(class="form-control-label") }}
                    {{ form.user_assets_uri(class="form-control form-control-lg") }}
                </div>
                    {{ form.submit_2(class="btn btn-outline-info") }}
                <div class="form-group">
                    {{ form.target.label(class="form-control-label") }}
                    {{ form.target(class="form-control form-control-lg") }}
                </div>
                <div class="form-group required">
                    {{ form.package_name.label(class="form-control-label") }}
                    {{ form.package_name(class="form-control form-control-lg") }}
                </div>
                <div class="form-group required">
                    {{ form.license_name.label(class="form-control-label") }}
                    {{ form.license_name(class="form-control form-control-lg") }}
                </div>
                {{ form.submit_final(class="btn btn-outline-info") }}
            </div>
            </fieldset>
            </div class="form-group">
            </div>  
        </form>
        <p>{{ error }}</p>
    </div>

{% endblock %}
from flask_wtf import FlaskForm
from wtforms import StringField, TextField, SubmitField, IntegerField, SelectField, validators

class InputForm(FlaskForm):

    stack_name = StringField('STACK NAME', validators=[validators.required()])
    deploy_bucket = SelectField('DEPLOYMENT BUCKET', validators=[validators.required()])
    key_pair = SelectField('KEY PAIR', validators=[validators.required()])
    start_point = SelectField('START POINT', validators=[validators.required()], choices=[("", "---"), ("", "fastq"), ("", "bam"), ("", "hdof"), ("", "gvcf"), ("", "vcf")])
    qc = SelectField('QC', choices=[("", "---"), ("","BAM"), ("","VCF")])

    submit_1 = SubmitField('Next')

    input_uri = StringField('INPUT BUCKET', validators=[validators.required()])
    output_uri = StringField('OUTPUT BUCKET', validators=[validators.required()])
    ref_uri = SelectField('REFERENCE BUCKET', validators=[validators.required()])
    user_assets_uri = StringField('USER ASSETS BUCKET', validators=[validators.required()])

    submit_2 = SubmitField('Next')

    target = StringField('TARGET')
    package_name = StringField('PACKAGE NAME', validators=[validators.required()])
    license_name = StringField('LICENSE NAME', validators=[validators.required()])

    submit_final = SubmitField('Execute Pipeline')
@app.route('/', methods=['GET', 'POST'])
def pipeline():
    form = InputForm(request.form)
    form.deploy_bucket.choices = [("", "---")] + [("", bucket["Name"]) for bucket in app.config['S3_CLIENT'].list_buckets()["Buckets"]]
    form.ref_uri.choices = [("", "---")] + [("", bucket["Name"]) for bucket in app.config['S3_CLIENT'].list_buckets()["Buckets"]]
    form.key_pair.choices = [("", "---")] + [("", pair["KeyName"]) for pair in app.config['EC2_CLIENT'].describe_key_pairs()["KeyPairs"]]

    if request.method == 'POST':
        STACK_NAME = form.stack_name.data
        DEPLOY_BUCKET = form.deploy_bucket.data
        KEY_PAIR = form.key_pair.data
        START_POINT = form.start_point.data
        QC = form.qc.data
        INPUT_URI = form.input_uri.data
        OUTPUT_URI = form.output_uri.data
        REF_URI = form.ref_uri.data
        USER_ASSETS_URI = form.user_assets_uri.data
        TARGET = form.target.data
        PACKAGE_NAME = form.package_name.data
        LICENSE_NAME = form.license_name.data

        flash('The pipeline has been executed!', 'success')

        dic = {
                "STACK_NAME": STACK_NAME, 
                "DEPLOY_BUCKET": DEPLOY_BUCKET,
                "KEY_PAIR": KEY_PAIR,
                "START_POINT": START_POINT,
                "QC": QC,
                "INPUT_URI": INPUT_URI,
                "OUTPUT_URI": OUTPUT_URI,
                "REF_URI": REF_URI,
                "USER_ASSETS_URI": USER_ASSETS_URI,
                "LOCAL_ASSETS_DIR": LOCAL_ASSETS_DIR,
                "SAMPLE_FILE": SAMPLE_FILE,
                "TARGET": TARGET,
                "PACKAGE_NAME": PACKAGE_NAME,
                "LICENSE_NAME": LICENSE_NAME,
              }

        proc = subprocess.Popen('pwd', shell=True, stdout=subprocess.PIPE)

        with open("input.json", 'w') as f:
            json.dump(dic, f)

        proc = subprocess.Popen('python pipeline.py -p', shell=True, stdout=subprocess.PIPE)

        return redirect(url_for('dashboard'))

    return render_template('pipeline.html', title='Pipeline Input', form=form)

@app.route('/dashboard')
def dashboard():
    return render_template('dashboard.html')
这是我的app.py,在这里处理表单数据。它目前仍然设置为只有一个提交按钮,因此我不确定如何处理此处的“下一个”按钮/分页:

{% extends 'layout.html' %}

{% block body %}
    <div class="content-section">
        <form method="POST" action="">
            {{ form.hidden_tag() }}
            <fieldset class="form-group">
                <legend class="border-bottom mb-4">Pipeline Input</legend>
                <div class="form-group required">
                    {{ form.stack_name.label(class="form-control-label") }}
                    {{ form.deploy_bucket(class="form-control form-control-lg") }}
                </div>
                <div class="form-group required">
                    {{ form.key_pair.label(class="form-control-label") }}
                    {{ form.key_pair(class="form-control form-control-lg") }}
                </div>
                <div class="form-group required">
                    {{ form.start_point.label(class="form-control-label") }}
                    {{ form.start_point(class="form-control form-control-lg") }}
                </div>
                <div class="form-group">
                    {{ form.qc.label(class="form-control-label") }}
                    {{ form.qc(class="form-control form-control-lg") }}
                </div>
                    {{ form.submit_1(class="btn btn-outline-info") }}
                <div class="form-group required">
                    {{ form.input_uri.label(class="form-control-label") }}
                    {{ form.input_uri(class="form-control form-control-lg") }}
                </div>
                <div class="form-group required">
                    {{ form.output_uri.label(class="form-control-label") }}
                    {{ form.output_uri(class="form-control form-control-lg") }}
                </div>
                <div class="form-group required">
                    {{ form.ref_uri.label(class="form-control-label") }}
                    {{ form.ref_uri(class="form-control form-control-lg") }}
                </div>
                <div class="form-group required">
                    {{ form.user_assets_uri.label(class="form-control-label") }}
                    {{ form.user_assets_uri(class="form-control form-control-lg") }}
                </div>
                    {{ form.submit_2(class="btn btn-outline-info") }}
                <div class="form-group">
                    {{ form.target.label(class="form-control-label") }}
                    {{ form.target(class="form-control form-control-lg") }}
                </div>
                <div class="form-group required">
                    {{ form.package_name.label(class="form-control-label") }}
                    {{ form.package_name(class="form-control form-control-lg") }}
                </div>
                <div class="form-group required">
                    {{ form.license_name.label(class="form-control-label") }}
                    {{ form.license_name(class="form-control form-control-lg") }}
                </div>
                {{ form.submit_final(class="btn btn-outline-info") }}
            </div>
            </fieldset>
            </div class="form-group">
            </div>  
        </form>
        <p>{{ error }}</p>
    </div>

{% endblock %}
from flask_wtf import FlaskForm
from wtforms import StringField, TextField, SubmitField, IntegerField, SelectField, validators

class InputForm(FlaskForm):

    stack_name = StringField('STACK NAME', validators=[validators.required()])
    deploy_bucket = SelectField('DEPLOYMENT BUCKET', validators=[validators.required()])
    key_pair = SelectField('KEY PAIR', validators=[validators.required()])
    start_point = SelectField('START POINT', validators=[validators.required()], choices=[("", "---"), ("", "fastq"), ("", "bam"), ("", "hdof"), ("", "gvcf"), ("", "vcf")])
    qc = SelectField('QC', choices=[("", "---"), ("","BAM"), ("","VCF")])

    submit_1 = SubmitField('Next')

    input_uri = StringField('INPUT BUCKET', validators=[validators.required()])
    output_uri = StringField('OUTPUT BUCKET', validators=[validators.required()])
    ref_uri = SelectField('REFERENCE BUCKET', validators=[validators.required()])
    user_assets_uri = StringField('USER ASSETS BUCKET', validators=[validators.required()])

    submit_2 = SubmitField('Next')

    target = StringField('TARGET')
    package_name = StringField('PACKAGE NAME', validators=[validators.required()])
    license_name = StringField('LICENSE NAME', validators=[validators.required()])

    submit_final = SubmitField('Execute Pipeline')
@app.route('/', methods=['GET', 'POST'])
def pipeline():
    form = InputForm(request.form)
    form.deploy_bucket.choices = [("", "---")] + [("", bucket["Name"]) for bucket in app.config['S3_CLIENT'].list_buckets()["Buckets"]]
    form.ref_uri.choices = [("", "---")] + [("", bucket["Name"]) for bucket in app.config['S3_CLIENT'].list_buckets()["Buckets"]]
    form.key_pair.choices = [("", "---")] + [("", pair["KeyName"]) for pair in app.config['EC2_CLIENT'].describe_key_pairs()["KeyPairs"]]

    if request.method == 'POST':
        STACK_NAME = form.stack_name.data
        DEPLOY_BUCKET = form.deploy_bucket.data
        KEY_PAIR = form.key_pair.data
        START_POINT = form.start_point.data
        QC = form.qc.data
        INPUT_URI = form.input_uri.data
        OUTPUT_URI = form.output_uri.data
        REF_URI = form.ref_uri.data
        USER_ASSETS_URI = form.user_assets_uri.data
        TARGET = form.target.data
        PACKAGE_NAME = form.package_name.data
        LICENSE_NAME = form.license_name.data

        flash('The pipeline has been executed!', 'success')

        dic = {
                "STACK_NAME": STACK_NAME, 
                "DEPLOY_BUCKET": DEPLOY_BUCKET,
                "KEY_PAIR": KEY_PAIR,
                "START_POINT": START_POINT,
                "QC": QC,
                "INPUT_URI": INPUT_URI,
                "OUTPUT_URI": OUTPUT_URI,
                "REF_URI": REF_URI,
                "USER_ASSETS_URI": USER_ASSETS_URI,
                "LOCAL_ASSETS_DIR": LOCAL_ASSETS_DIR,
                "SAMPLE_FILE": SAMPLE_FILE,
                "TARGET": TARGET,
                "PACKAGE_NAME": PACKAGE_NAME,
                "LICENSE_NAME": LICENSE_NAME,
              }

        proc = subprocess.Popen('pwd', shell=True, stdout=subprocess.PIPE)

        with open("input.json", 'w') as f:
            json.dump(dic, f)

        proc = subprocess.Popen('python pipeline.py -p', shell=True, stdout=subprocess.PIPE)

        return redirect(url_for('dashboard'))

    return render_template('pipeline.html', title='Pipeline Input', form=form)

@app.route('/dashboard')
def dashboard():
    return render_template('dashboard.html')

如果您坚持使用Flask完成此任务,最简单的方法是将表单分为多个表单,可能是按类别。处理表单后,您的flask代码将重定向到下一个表单

然而,特别是在2018年,这可能应该在客户端而不是服务器端完成。原因是这里的问题实际上与负责处理表单的Flask无关,而是与负责显示表单的前端有关

好处很多。首先,您可以一次加载整个表单,但可以将每次显示的内容分块。这将允许您通过只提交一个表单来保持flask代码的简单性,但可以精确控制向用户显示的内容。此外,您正在减少从客户端到服务器的往返次数,这将为您的用户提供更好的性能


如果您希望避免编写字体结束分页代码,那么有一些解决方案可以集成到表单中。我个人成功地使用了该功能。

这也是我想说的,但在这个答案中更好、更清晰@nmg49:谢谢你的意见。您能否提供一个具体的例子,说明如何“将每次显示的内容分块”?我对烧瓶不熟悉,不知道怎么做。@claudiadast这不是烧瓶的事。前端的任何动态操作都将在javascript中完成,javascript是基于javascript构建的库(如jQuery),或者是在后台使用原始js的前端框架(如angular)。简而言之,如果你想沿着这条路走下去,你需要学习前端web开发。我上面列出的名字是很好的开始。举个例子,这完全超出了你的问题范围。我相信已经有好几个这样的问题了,如果没有,你可以问一个新问题。