Я работаю над одностраничным сайтом Flask. Вчера я написал форму, которая работала (данные были вставлены в SQL, а файл был сохранен в локальном каталоге). Сегодня я решил поработать над внутренней проверкой. Поэтому были использованы WTForms. Тем не менее, файл не сохраняется, и данные формы не сохраняются.
Буду рад вашей помощи. Я не могу понять, что не так.
app.py
import os
from flask import Flask, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
from wtforms import Form, SelectField, StringField, FileField, DecimalField, validators
project_dir = os.path.dirname(os.path.abspath(__file__))
database_file = f"sqlite:///{os.path.join(project_dir, 'compounds.db')}"
upload_file = os.path.join(project_dir,"static/data/")
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = database_file
db = SQLAlchemy(app)
class InputForm(Form):
titleForm = SelectField('Title?',choices=[('mr','Mr.'),('mrs','Mrs.'),('dr','Dr.'),('prof','Prof.')],validators=[validators.DataRequired()])
name_surnameForm = StringField('Name and surname?',validators=[
validators.DataRequired(),
validators.Regexp('/^[a-zA-Z\s]*$/'),
validators.Length(5,30)])
institutionForm = StringField('Name and surname?',validators=[
validators.DataRequired(),
validators.Regexp('/^[a-zA-Z\s]*$/'),
validators.Length(5,30)])
assayForm = SelectField('Test?',choices=[('abts','ABTS'),('dpph','DPPH'),('frap','FRAP')],validators=[validators.DataRequired()])
resultForm = DecimalField('Result?', validators=[
validators.DataRequired(),
validators.Regexp('([0-9]+(\.[0-9]+)?)')])
descriptorsForm = FileField('File?',validators=[
validators.DataRequired(),
])
class Data(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(5))
name_surname = db.Column(db.String(50))
institution = db.Column(db.String(50))
assay = db.Column(db.String(10))
result = db.Column(db.Integer())
descriptors = db.Column(db.LargeBinary)
@app.route('/', methods=["GET","POST"])
def home():
form = InputForm(request.form)
if request.method == 'POST':
text_form = request.form
data_file = request.files['inputFile']
newData = Data(
title = request.form['inputCompound'],
name_surname = (request.form['inputTitle'] + " " + request.form['inputName']),
institution = request.form['inputInstitution'],
assay = request.form['inputAssay'],
result = request.form['inputResult'],
descriptors = request.files['inputFile'].read(),
)
if form.validate():
data_file.save(upload_file+"test")
db.session.add(newData)
db.session.commit()
return redirect(url_for('/'))
values = {
'R2':'-',
'R2adj':'-',
'CCC':'-',
'RMSE':'-',
'Q2loo':'-',
'R2lmo':'-',
}
return render_template('home.html',values=values,form=form)
if __name__ == '__main__':
app.run(host="127.0.0.1", port=5001, debug=False)
home. html
<!DOCTYPE html>
<html lang="en">
<head>
<title>PAs MLR</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"></script>
<script src="static/js/general.js"></script>
</head>
<body>
<div class="container">
<div class="row d-none" id="dataSubmitForm">
<form method="POST" action="/" role='form' class="mx-auto" enctype="multipart/form-data">
{{ form.csrf }}
<div class="form-row">
<div class="form-group col-md-4">
<label for="inputTitle">Title</label>
<select name="inputTitle" class="form-control">
<option selected>Choose...</option>
<option>Prof.</option>
<option>Dr.</option>
<option>Mr.</option>
<option>Mrs.</option>
</select>
</div>
<div class="form-group col-md-8">
<label for="inputName">Name and Surname</label>
<input type="text" class="form-control" name="inputName" placeholder="Name and Surname">
</div>
</div>
<div class="form-group">
<label for="inputInstitution">Institution</label>
<input type="text" class="form-control" name="inputInstitution" placeholder="Institution">
</div>
<div class="form-row">
<label for="inputCompound">Compound</label>
<select name="inputCompound" class="form-control">
<option selected>Choose...</option>
<option>salicylic</option>
<option>gentisic</option>
</select>
</div>
<div class="form-row">
<div class="form-group col-md-4">
<label for="inputAssay">Assay</label>
<select name="inputAssay" class="form-control">
<option selected>Choose...</option>
<option>ABTS</option>
<option>DPPH</option>
<option>FRAP</option>
</select>
</div>
<div class="form-group col-md-8">
<label for="inputResult">Result</label>
<input type="text" class="form-control" name="inputResult" placeholder="Result">
</div>
</div>
<div class="form-group">
<label for="inputFile">Descriptors file</label>
<input type="file" class="form-control-file" name="inputFile">
</div>
<button type="submit" class="btn btn-primary">Send</button>
</form>
</div>
</div>
</body>
</html>