Форма WTForms не определена - PullRequest
0 голосов
/ 27 мая 2020

Эй, может кто-нибудь указать, почему я продолжаю получать эту ошибку? Он работал несколько дней go, но когда я добавил раздел кода simulator. html, он просто перестал работать по какой-то причине. Мой учитель тоже не знает, почему ... Программа прямо сейчас представляет собой просто форму входа и регистрации с другой страницей, которая будет выполнять моделирование Powerball для моего задания!

app.py

import sqlite3
from flask import Flask, render_template, request, redirect, url_for, flash, session, logging
from flask_sqlalchemy import SQLAlchemy
from flask_login import UserMixin, LoginManager, login_user, login_required, logout_user, current_user
from wtforms import Form, StringField, PasswordField, validators, IntegerField

class simulatorform(Form):
    nwb = IntegerField("1-2", [validators.NumberRange(min=1, max=2)])
    rwb = IntegerField("1-2", [validators.DataRequired()])
    npb = IntegerField("1-2", [validators.NumberRange(min=1, max=2), validators.DataRequired()])
    rpb = IntegerField("1-2", [validators.NumberRange(min=1, max=2, message="Range of 1-2"), validators.DataRequired()])
    ballswin = IntegerField("1-2", [validators.NumberRange(min=1, max=2), validators.DataRequired()])
    pbwin = IntegerField("1-2", [validators.NumberRange(min=1, max=2), validators.DataRequired()])
    user = StringField("Username", [validators.Length(min=4, max=20)])
    psw = PasswordField("Password",
                        [validators.DataRequired(), validators.EqualTo("confirm", message="Passwords do not match")])
    confirm = PasswordField("Confirm Password")
@app.route('/simulator', methods=["GET", "POST"])
def route_simulator():
    form = simulatorform(request.form)
    if request.method == "POST":
        connie = sqlite3.connect('pb.db')
        c = connie.cursor()
        nwb = form.nwb.data
        rwb = form.rwb.data
        npb = form.npb.data
        rpb = form.rpb.data
        ballswin = form.ballswin.data
        pbwin = form.pbwin.data
        return render_template("simulator.html", form=form)
    else:
        return render_template("signup.html", form=form)
@app.route('/signup', methods=["GET", "POST"])
def route_signup():
    form = simulatorform(request.form)
    if request.method == "POST" and form.validate():
        connie = sqlite3.connect('pb.db')
        c = connie.cursor()
        user = form.user.data
        pw = form.psw.data
        c.execute("INSERT INTO users(username, password) VALUES (?, ?)", (user, pw))
        connie.commit()
        connie.close()
        redirect(url_for("route_login"))
        flash("Your are now registered and can login", "success")
    else:
        return render_template("signup.html", form=form)

симулятор. html

    <form method="POST" action="http://localhost:5000/simulator">
        <div class="container">
            <div class="row">
                <div class="col-sm">

                    <div class="form-group">
                        {{ render_field(form.nwb,class_="form-control") }}
                    </div>
                    <div class="form-group">
                        {{ render_field(form.rwb,class_="form-control") }}
                    </div>

                </div>
                <div class="col-sm">

                    <div class="form-group">
                        {{ render_field(form.npb,class_="form-control") }}
                    </div>
                    <div class="form-group">
                        {{ render_field(form.rpb,class_="form-control") }}
                    </div>


                </div>
                <div class="col-sm">

                    <div class="form-group">
                        {{ render_field(form.ballswin,class_="form-control") }}
                    </div>
                    <div class="form-group">
                        {{ render_field(form.pbwin,class_="form-control") }}
                    </div>
                    <p><input type="submit" class="btn btn-primary" value="Submit"></p>
                </div>
            </div>
        </div>
    </form>

регистрация. html

 <div class="container">
        <div class="row">
            <div class="col-sm">

            </div>
            <div class="col-sm">
                {% from "_formhelpers.html" import render_field %}
                <form method="POST" action="http://localhost:5000/signup">
                    <div class="form-group">
                        {{ render_field(form.user,class_="form-control") }}
                    </div>
                    <div class="form-group">
                        {{ render_field(form.psw,class_="form-control") }}
                    </div>
                    <div class="form-group">
                        {{ render_field(form.confirm,class_="form-control") }}
                    </div>
                    <p><input type="submit" class="btn btn-primary" value="Submit"></p>
                </form>
            </div>
            <div class="col-sm">

            </div>
        </div>
    </div>

Путь входа

@app.route('/login', methods=["GET", "POST"])
def route_login():
    if request.method == "GET":
        return render_template("login.html")
    else:
        try:
            my_user = Users.query.filter_by(username=request.form["username"]).first()
        except:
            return redirect(url_for("route_login"))

        if my_user is not None:
            if my_user.password == request.form["password"]:
                login_user(my_user)
                return render_template("simulator.html")
            else:
                flash("An error occurred, please check username and password", "error")
                return redirect(url_for('route_login'))
        else:
            flash("An error occurred, please check username and password", "error")
            return redirect(url_for('route_login'))

Вход HTML

<div class="container">
        {% with messages = get_flashed_messages(category_filter=["error"]) %}
            {% if messages %}
                {% for message in messages %}
                    <div class="alert alert-warning" role="alert">{{ message }}</div>
                {% endfor %}
            {% endif %}
        {% endwith %}
    </div>
    <div>
        {% with messages = get_flashed_messages(category_filter=["success"]) %}
            {% if messages %}
                {% for message in messages %}
                    <div class="alert alert-warning" role="alert">{{ category }}{{ message }}</div>
                {% endfor %}

            {% endif %}
        {% endwith %}
    </div>

    <div class="container">
        <div class="row">
            <div class="col-sm">

            </div>
            <div class="col-sm">
                <form action="http://localhost:5000/login" method="post">
                    <div class="form-group">
                        <label for="exampleInputUsername1">Username</label>
                        <input name="username" type="text" class="form-control" id="exampleInputEmail1"
                               aria-describedby="emailHelp"
                               placeholder="Enter Username">
                    </div>
                    <div class="form-group">
                        <label for="exampleInputPassword1">Password</label>
                        <input name="password" type="password" class="form-control" id="exampleInputPassword1"
                               placeholder="Password">
                    </div>
                    <button type="submit" class="btn btn-primary">Submit</button>
                </form>
            </div>
            <div class="col-sm">

            </div>
        </div>
    </div>

Ошибка отслеживания

* Serving Flask app "app.py"
 * Environment: development
 * Debug mode: off
C:\Users\britsge\OneDrive - Iona College\Year 11\DSO\PowerballSite\venv\lib\site-packages\flask_sqlalchemy\__init__.py:814: UserWarning: Neither SQLALCHEMY_DATABASE_URI nor SQLALCHEMY_BINDS is set. Defaulting SQLALCHEMY_DATABASE_URI to "sqlite:///:memory:".
  'Neither SQLALCHEMY_DATABASE_URI nor SQLALCHEMY_BINDS is set. '
C:\Users\britsge\OneDrive - Iona College\Year 11\DSO\PowerballSite\venv\lib\site-packages\flask_sqlalchemy\__init__.py:835: FSADeprecationWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True or False to suppress this warning.
  'SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and '
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [27/May/2020 10:01:46] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [27/May/2020 10:01:48] "GET /login HTTP/1.1" 200 -
[2020-05-27 10:01:52,280] ERROR in app: Exception on /login [POST]
Traceback (most recent call last):
  File "C:\Users\britsge\OneDrive - Iona College\Year 11\DSO\PowerballSite\venv\lib\site-packages\flask\app.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\britsge\OneDrive - Iona College\Year 11\DSO\PowerballSite\venv\lib\site-packages\flask\app.py", line 1952, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\Users\britsge\OneDrive - Iona College\Year 11\DSO\PowerballSite\venv\lib\site-packages\flask\app.py", line 1821, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "C:\Users\britsge\OneDrive - Iona College\Year 11\DSO\PowerballSite\venv\lib\site-packages\flask\_compat.py", line 39, in reraise
    raise value
  File "C:\Users\britsge\OneDrive - Iona College\Year 11\DSO\PowerballSite\venv\lib\site-packages\flask\app.py", line 1950, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Users\britsge\OneDrive - Iona College\Year 11\DSO\PowerballSite\venv\lib\site-packages\flask\app.py", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "C:\Users\britsge\OneDrive - Iona College\Year 11\DSO\PowerballSite\app.py", line 91, in route_login
    return render_template("simulator.html")
  File "C:\Users\britsge\OneDrive - Iona College\Year 11\DSO\PowerballSite\venv\lib\site-packages\flask\templating.py", line 140, in render_template
    ctx.app,
  File "C:\Users\britsge\OneDrive - Iona College\Year 11\DSO\PowerballSite\venv\lib\site-packages\flask\templating.py", line 120, in _render
    rv = template.render(context)
  File "C:\Users\britsge\OneDrive - Iona College\Year 11\DSO\PowerballSite\venv\lib\site-packages\jinja2\environment.py", line 1090, in render
    self.environment.handle_exception()
  File "C:\Users\britsge\OneDrive - Iona College\Year 11\DSO\PowerballSite\venv\lib\site-packages\jinja2\environment.py", line 832, in handle_exception
    reraise(*rewrite_traceback_stack(source=source))
  File "C:\Users\britsge\OneDrive - Iona College\Year 11\DSO\PowerballSite\venv\lib\site-packages\jinja2\_compat.py", line 28, in reraise
    raise value.with_traceback(tb)
  File "C:\Users\britsge\OneDrive - Iona College\Year 11\DSO\PowerballSite\templates\simulator.html", line 1, in top-level template code
    {% extends 'base.html' %}
  File "C:\Users\britsge\OneDrive - Iona College\Year 11\DSO\PowerballSite\templates\base.html", line 84, in top-level template code
    {% block results %}
  File "C:\Users\britsge\OneDrive - Iona College\Year 11\DSO\PowerballSite\templates\simulator.html", line 23, in block "results"
    {{ render_field(form.nwb,class_="form-control") }}
  File "C:\Users\britsge\OneDrive - Iona College\Year 11\DSO\PowerballSite\venv\lib\site-packages\jinja2\environment.py", line 471, in getattr
    return getattr(obj, attribute)
jinja2.exceptions.UndefinedError: 'form' is undefined
127.0.0.1 - - [27/May/2020 10:01:52] "POST /login HTTP/1.1" 500 -
...