Python 试着把一个烧瓶形状分解成;“块”;分页
我最初在一个网页上有一个长的Flask表单,但现在我想将该表单分解成更小的块,并用分页按钮遍历这些块。我只是对如何处理这个问题有点困惑 到目前为止,我已经为这些不同的“块”创建了单独的表单类和html模板,但我不确定如何在主app.py脚本中将它们联系在一起。我打算采用动态路由方法,但我认为我做得不对。有什么建议吗 表单类:Python 试着把一个烧瓶形状分解成;“块”;分页,python,html,flask,flask-wtforms,Python,Html,Flask,Flask Wtforms,我最初在一个网页上有一个长的Flask表单,但现在我想将该表单分解成更小的块,并用分页按钮遍历这些块。我只是对如何处理这个问题有点困惑 到目前为止,我已经为这些不同的“块”创建了单独的表单类和html模板,但我不确定如何在主app.py脚本中将它们联系在一起。我打算采用动态路由方法,但我认为我做得不对。有什么建议吗 表单类: from flask_wtf import FlaskForm from wtforms import StringField, TextField, SubmitFiel
from flask_wtf import FlaskForm
from wtforms import StringField, TextField, SubmitField, IntegerField, SelectField, validators
class InputForm1(FlaskForm):
stack_name = StringField('STACK NAME', validators=[validators.required()])
resource_cfn_tmpl_deploy_bucket = SelectField('PIPELINE 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")])
class InputForm2(FlaskForm):
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()])
class InputForm3(FlaskForm):
target = StringField('TARGET')
package_name = StringField('PACKAGE NAME', validators=[validators.required()])
license_name = StringField('LICENSE NAME', validators=[validators.required()])
class InputForm4(FlaskForm):
cohort_prefix = StringField('COHORT PREFIX', validators=[validators.required()])
build = SelectField('BUILD', validators=[validators.required()], choices=[("", "---"), ("","GRCh38"), ("","GRCh37")])
ome = SelectField('OME', validators=[validators.required()], choices=[("", "---"), ("", "wgs"), ("", "wes")])
class InputForm5(FlaskForm):
cloudspan_mode = SelectField('CLOUDSPAN MODE', choices=[("", "---"), ("", "validation"), ("", "qc")])
project_id = StringField('PROJECT ID')
zone = StringField('ZONE')
cloud_file = StringField('CLOUD FILE')
submit_final = SubmitField('Execute Pipeline')
pipeline_1.html:(我还有pipeline_2…..pipeline_5.html,具有上面表单类中定义的不同输入)
{%extends'layout.html%}
{%block body%}
{{form.hidden_tag()}}
管道输入
{{form.stack_name.label(class=“form control label”)}
{{form.stack_name(class=“form control form control lg”)}
{{form.resource\u cfn\u tmpl\u deploy\u bucket.label(class=“form control label”)}
form.resource\u cfn\u tmpl\u deploy\u bucket(class=“form control form control lg”)}
{{form.key_pair.label(class=“form control label”)}
{{form.key_pair(class=“form control form control lg”)}
{{form.start_point.label(class=“form control label”)}
{{form.start_point(class=“form control form control lg”)}
{{form.qc.label(class=“form control label”)}
{{form.qc(class=“form control form control lg”)}
{{error}}
{%endblock%}
app.py:(当前的尝试,我知道这是错误的,但这就是我被卡住的地方)
#导入烧瓶应用程序
从烧瓶导入烧瓶、url、呈现模板、请求、闪存、重定向
从数学导入单元
从日期时间导入日期时间
从用户输入导入InputForm1、InputForm2、InputForm3、InputForm4、InputForm5
导入json
导入子流程
导入操作系统
导入系统
进口boto3
app=烧瓶('管道-ui')
app.config['S3_CLIENT']=boto3.CLIENT('S3')
app.config['EC2_CLIENT']=boto3.CLIENT('EC2')
app.debug=True
@app.route('/',方法=['GET','POST'])
def管道(页码):
如果request.method==“POST”:
如果页码=1:
form=InputForm1(request.form)
返回重定向('/2')
如果页码=2:
form=InputForm2(request.form)
返回重定向(“/3”)
如果页码=3:
form=InputForm3(request.form)
返回重定向('/4')
如果页码=4:
form=InputForm4(request.form)
返回重定向('/5')
如果页码=5:
form=InputForm5(request.form)
返回重定向('结果')
返回render_模板('pipeline_{}.html'.format(page_num),title='pipeline Input',form=form)
请记住,请求之间没有状态,因此,如果其他所有操作都正确,您需要一种方法来存储下一步的每个步骤的数据
如果您不能将每个步骤的数据存储在数据库中,则可以考虑重新排序表单,以便每一步对数据库的提交都有意义。 如果您不使用数据库(或文件),或者在所有步骤完成之前无法发送数据,那么另一个选项就是将每个步骤的数据存储到下一个步骤中的隐藏输入中
class StepForm(FlaskForm):
previous_field = SomeField(widget=HiddenInput())
# ...
step = StepForm()
step.previous_field.data = previous_step.field.data
当然,您也可以在前端使用javascript进行分页,并在最后一个请求中发送所有数据。我想我会指出两个问题(但实际上我认为还有更多问题,这是一个复杂的路由):1)
返回呈现模板('pipeline_{}.html'.format(page_num),title='Pipeline Input',form=form)
,在GET
的情况下,此处未定义form
。2) 您没有为表单定义操作终结点:action=”“
tryaction=“{{url\u for('app.pipeline',page\u num=X)}}”
# Import the Flask app
from flask import Flask, url_for, render_template, request, flash, redirect
from math import ceil
from datetime import datetime
from user_input import InputForm1, InputForm2, InputForm3, InputForm4, InputForm5
import json
import subprocess
import os
import sys
import boto3
app = Flask('pipeline-ui')
app.config['S3_CLIENT'] = boto3.client('s3')
app.config['EC2_CLIENT'] = boto3.client('ec2')
app.debug = True
@app.route('/<page_num>', methods=['GET', 'POST'])
def pipeline(page_num):
if request.method == "POST":
if page_num == 1:
form = InputForm1(request.form)
return redirect('/2')
if page_num == 2:
form = InputForm2(request.form)
return redirect('/3')
if page_num == 3:
form = InputForm3(request.form)
return redirect('/4')
if page_num == 4:
form = InputForm4(request.form)
return redirect('/5')
if page_num == 5:
form = InputForm5(request.form)
return redirect('results')
return render_template('pipeline_{}.html'.format(page_num), title='Pipeline Input', form=form)
class StepForm(FlaskForm):
previous_field = SomeField(widget=HiddenInput())
# ...
step = StepForm()
step.previous_field.data = previous_step.field.data