Ошибка при проверке формы (Flask + SQLAlchemy + WTForms + Bootstrap) - PullRequest
0 голосов
/ 14 апреля 2020

Я работаю над одностраничным сайтом 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...