Ошибка "attempt to write a readonly database" sqlite, python, flask

Рейтинг: 0Ответов: 0Опубликовано: 30.07.2023

Есть проект, который содержит в себе 3 шаблона, /blog, /blog/newpost/ и /blog/(id конкретной записи из бд). Суть заключается в том, что на /blog/newpost можно добавить запись в бд, после чего идет redirect на /blog/(id данной записи). По url /blog соответсвенно можно увидеть все записи в бд. Я использую бд sqlite, язык python и фреймворк flask. Бд лежит рядом с .py файлом.
Проблема заключается в том, что на локальном сервере все работает как нужно. Так, как описано выше. Но, при попытке деплоя происходит следующая ситуация - /blog со всеми записями в бд доступна, /blog/newpost также доступна, но, когда я пытаюсь добавить новую запись в бд, нажимаю сабмит, в этот момент redirect не происходит, а заместо этого я остаюсь на том же url (/blog/newpost) с ошибкой 500.

В логах ошибка:

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) attempt to write a readonly database"

Подскажите, пожалуйста, что можно сделать и почему база считается readonly. Я пробовал в свойтсвах самой бд и свойствах папки менять доступ на Все и давал полный доступ как к папке, так и к самой бд, но проблему это не решило.

Вот код файла .py:

from flask import Flask, request, Response, redirect, render_template, abort
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime
import os
import jinja2

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blog.db'
app.config['SQLALCHEMY_TRACK_MODIFICATION'] = False
db = SQLAlchemy(app)

template_dir = os.path.join(os.path.dirname(__file__), 'templates')
jinja_env = jinja2.Environment(loader = jinja2.FileSystemLoader(template_dir), autoescape=True)

class Post(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    subject = db.Column(db.String(100), unique = True)
    content = db.Column(db.Text, unique = True)
    created = db.Column(db.DateTime, default = datetime.utcnow)

@app.route("/blog")  
def main_page():
    t = jinja_env.get_template("blog.html")
    posts = Post.query.order_by(Post.created.desc()).all()
    if len(posts) > 10:
        posts = posts[0:10]
    return t.render(posts=posts)

@app.route("/blog/<int:id>")
def permalink(id):
    t = jinja_env.get_template("permalink.html")
    posts = Post.query.order_by(Post.created).all()
    posts_id = []
    for post in posts:
        posts_id.append(post.id)
    if id in posts_id:
        posts = posts[id - 1]
        return t.render(posts=posts)
    return abort(404)

@app.route("/blog/newpost", methods=['GET', 'POST'])
def new_post():
    t = jinja_env.get_template("newpost.html")
    if request.method == 'POST':
        subject = request.form["subject"]
        content = request.form["content"]
        if subject and content:
            posts = Post(subject=subject, content=content)
            db.session.add(posts)
            db.session.commit()
            post_id = str(posts.id)
            return redirect("/blog/" + post_id)
        else:
            error = "We need both a subject and blog"
            return t.render(error=error, subject=subject, content=content) 
    return t.render()

if __name__ == "__main__":
    app.run()

Ответы

Ответов пока нет.