Сбой приложения Flask на сервере Heroku — (at = ошибка, код = H10)

#sqlite #flask #flask-sqlalchemy #backend

Вопрос:

Я создал веб-сайт со списком задач, который помогает нам сохранять наши задачи, обновлять и удалять и т. Д. Он работал на локальном хосте, но когда я попытался выполнить развертывание на сервере Heroku, я получаю сообщение об ошибке приложения, в котором говорится, что приложение разбилось, при проверке журналов я обнаружил это

 at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=todos-app-for-user.herokuapp.com request_id=0ebe473d-6fcd-46f7-9bb1-3df412bb202e fwd="171.49.253.118" dyno=web.1 connect=5001ms service= status=503 bytes= protocol=https

at=error code=H10 desc="App crashed" method=GET path="/" host=todos-app-for-user.herokuapp.com request_id=04ecca7e-06e0-49b3-b66b-72cbc74eb969 fwd="171.49.253.118" dyno= connect= service= status=503 bytes= protocol=https
 

кроме того, я получил ошибки в базе данных, в которых указано, что

 sqlite3.OperationalError: table user already exists
 

Я проверил много вопросов по StackOverflow и внес изменения, но это не сработало, после развертывания оно работало некоторое время, но после этого выдается ошибка приложения.

прежде всего init.py содержимое файла

 from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from os import path
from flask_login import LoginManager

db = SQLAlchemy()
DB_NAME = "database.db"


def create_app():
    app = Flask(__name__)
    app.config['SECRET_KEY'] = 'hjshjhdjah kjshkjdhjs'
    app.config['SQLALCHEMY_DATABASE_URI'] = f'sqlite:///{DB_NAME}'
    db.init_app(app)

    from .views import views
    from .auth import auth
    
    app.register_blueprint(views, url_prefix='/')
    app.register_blueprint(auth, url_prefix='/')
    from .models import User, Todo

    with app.app_context():
        db.create_all()

    login_manager = LoginManager()
    login_manager.login_view = 'auth.login'
    login_manager.init_app(app)

    @login_manager.user_loader
    def load_user(id):
        return User.query.get(int(id))

    return app

 

мой models.py содержимое файла, я сопоставил пользователей со списком
задач База данных пользователей содержит пароль электронной почты и имя, база данных задач содержит заголовок и описание, связанные с их задачами

 from . import db
from flask_login import UserMixin
from sqlalchemy.sql import func

class User(db.Model , UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(200), unique=True)
    password = db.Column(db.String(200))
    first_name = db.Column(db.String(200))
    notes = db.relationship('Todo')


class Todo(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(200), nullable=False)
    desc = db.Column(db.String(500), nullable=False)
    date_created = db.Column(db.DateTime(timezone=True), default=func.now())
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))

    # def __repr__(self) -> str:
    #     return f"{self.id} - {self.title}"
 

мой auth.py содержание

 from flask import Blueprint, render_template, request, flash, redirect
from .models import User
from werkzeug.security import generate_password_hash, check_password_hash
from . import db
from flask_login import login_user, login_required, logout_user, current_user


auth = Blueprint('auth', __name__)

@auth.route("/login", methods=['GET','POST'])
def login():
    if request.method == 'POST':
        email = request.form.get("floatingInput")
        password = request.form.get("floatingPassword")
        user = User.query.filter_by(email=email).first()
        if user:
            if check_password_hash(user.password, password):
                flash('Logged in Succesfully', category='success')
                login_user(user, remember=True)
                return redirect('/')
            else:
                flash('Incorrect Email/Password , try again...', category='error')
        else:
            flash('Email does not exist...', category='error')

    return render_template("login.html")

@auth.route("/signup", methods=['GET','POST'])
def signup():
    if request.method == 'POST':
        email = request.form.get("floatingInput")
        first_name = request.form.get("firstName")
        password1 = request.form.get("floatingPassword")
        password2 = request.form.get("floatingPassword1")
        user = User.query.filter_by(email=email).first()
        if user:
            flash('Email already exists..',category='error')
        elif len(email) < 5:
            flash('Email must be greater than 4 characters', category='error')
        elif len(first_name)<2:
            flash('Your name must atleast have 2 characters', category='error')
        elif password1 !=password2:
            flash('Passwords does not match', category='error')
        elif len(password1)<7:
            flash('Password must atleast contain 7 characters', category='error')
        else:
            # good to go and add it to database
            new_user = User(email=email, first_name=first_name, password=generate_password_hash(password1, method='sha256'))
            db.session.add(new_user)
            db.session.commit()
            print(new_user)
            login_user(new_user, remember=True)
            flash("Account created Successfully..", category='success')
            return redirect('/')
               
    return render_template("signup.html", user=current_user)

@auth.route("/logout")
@login_required
def logout():
    logout_user()
    return redirect('/login')
 

Я также установил gunicorn и добавил строку в файл Procfile

 web: gunicorn main:app 
 

для полных файлов проекта
Ссылка на Github: https://github.com/neeraj162/new-todos-test2

Я отлаживал этот код в течение 1 недели, но не смог его решить, я был бы рад, если бы смог узнать причину моей ошибки и как ее решить… это ошибка из-за кода, если да, то где?(также он отлично работает на локальном хосте) или это ошибка при развертывании моего приложения??

Комментарии:

1. Вы также должны опубликовать результат heroku logs --tail . Это, скорее всего, точно подскажет вам, что происходит не так с этим развертыванием. Может быть ваш procfile или отсутствующие переменные среды и т. Д…