#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 или отсутствующие переменные среды и т. Д…