невозможно инициализировать базу данных, wtforms-alchemy, flask, ERROR LookupError: преобразователь 'init' не существует - PullRequest
0 голосов
/ 04 апреля 2019

Я изменяю свое приложение, включив в него wtforms-alchemy, как это выглядит из документов https://wtforms -alchemy.readthedocs.io / en / latest / ввод.html как более простых, я удалил вниз мой код к основам, так что, если я получаю какие-либо ошибки, я могу найти его быстрее, проблема в фрагменте кода, который должен использоваться для работы wtforms-alchemy с флягой, вот ссылка https://wtforms - alchemy.readthedocs.io/en/latest/advanced.html

когда я удаляю этот фрагмент, я не могу инициализировать базу данных, так как класс ModelForm не распознается, и поэтому я хочу перенести его. В документах говорится, что требуется только фрагмент, но мне интересно, если это моя основная __init__.py настройка, которая неверна.

приложение __init__.py

import os
import RPi.GPIO as GPIO
from flask import Flask, request, current_app
from config import Config
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_login import LoginManager
from flask_bootstrap import Bootstrap
from flask_mail import Mail
from flask_wtf import FlaskForm
from wtforms_alchemy import model_form_factory

db = SQLAlchemy()
migrate = Migrate()
login = LoginManager()
login.login_view = 'auth.login'
login.login_message = 'Please log in to access this page.'
mail = Mail()
bootstrap = Bootstrap()

def create_app(test_config=None):
    # create and configure the app
    app = Flask(__name__, instance_relative_config=True)
    app.config.from_object(Config)

    db.init_app(app)
    migrate.init_app(app, db)
    login.init_app(app)
    bootstrap.init_app(app)
    mail.init_app(app)


   from homeHeating.auth import bp as auth_bp
   app.register_blueprint(auth_bp)

control.py

from homeHeating import db
from homeHeating.control.forms import AddPinForm
from homeHeating.models import User, Pins
from homeHeating.control import bp
from mySensorModule import read_sensor
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)


@bp.route('/', methods=['GET', 'POST'])
@bp.route('/index', methods=['GET', 'POST'])
@login_required
def index():
   pins = Pins.query.all()
   for pin in pins:
       GPIO.setup(pin.pin, GPIO.OUT)
       pin.state = GPIO.input(pin.pin)
       db.session.commit()
   templateData = {
       'pins' : pins
     }
   return render_template('control/index.html', **templateData)

forms.py

from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, SelectField
from wtforms.validators import ValidationError, DataRequired, Email, 
EqualTo
from homeHeating.models import User, Pins
from wtforms_alchemy.fields import QuerySelectField
from wtforms_alchemy import model_form_factory


BaseModelForm = model_form_factory(FlaskForm)

class ModelForm(BaseModelForm):
    @classmethod
    def get_session(self): #this part is the problem
        return db.session

class AddPinForm(ModelForm):
    class Meta:
        model = Pins

    def validate_Name(self, name):
        pins = Pins.query.filter_by(pin=name.data).first()
        if pins is not None:
           raise ValidationError('Please use a different name.')

ERROR

  File "/home/pi/heating/homeHeating/__init__.py", line 38, in create_app
app.register_blueprint(control_bp)
raise LookupError('the converter %r does not exist' % converter_name)
LookupError: the converter 'init' does not exist

Я ожидаю, что смогу инициализировать базу данных с этим, как описано в документации, я думаю, что ошибка в моем файле init .py, где я, вероятно, использую настройку для sqlalchemy , Но это за мной! код ошибки должен быть длинным, но я включил две строки, которые, как мне кажется, указывают на проблему. Заранее извиняюсь, если кода много или недостаточно, пожалуйста, спросите, хотите ли вы больше. С уважением, Павел

EDIT Я забыл добавить 'models.py'

models.py

from homeheating import db, login
from datetime import datetime
from time import time
from flask import current_app
from flask_wtf import FlaskForm
class Pins(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    pin = db.Column(db.Integer, index=True, unique=True)
    name = db.Column(db.String(64))
    upDown = db.Column(db.String(4))
    state = db.Column(db.String(9))

    def __repr__(self):
        return '<Pins {}>'.format(self.pin)

EDIT2 Прошу прощения, я не включил весь код в «control.py», после того, как поиграл с этим кодом сегодня утром, я обнаружил, что следующая функция может быть проблемой. Это то, что я сделал. Я переместил фрагмент из «forms.py» в «models.py» и добавил «ModelForm» к импорту в формах (т.е. из homeHeating.models import ModelForm, ...). так, чтобы нарушить (возможно) код в 'control.py'

control.py

@bp.route('/control/addpin/<init:id>', methods=['GET', 'POST'])
@login_required
def add_or_edit_pin(id=None):
    obj = Pins.query.get_or_404(id)
    form = AddPinForm(request.form, obj=obj)
    if form.validate_on_submit():
        form.populate_obj(obj)
        db.session.add(obj)
        db.session.commit()
        flash('Congratulations, you have now a registered a device!')
        return redirect(url_for('control.addpin'))
    return render_template('control/addpin.html', title='Add pin',
                       form=form)

Это хорошая новость, поскольку я могу использовать wtforms-alchemy, но плохая новость, поскольку эта функция add_edit полностью соответствует моим планам, поскольку я хочу использовать эту модель для каждой формы !!! PS. Этот код от помощи здесь в другом из моих вопросов и на сайте wtforms-alchemy.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...