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

Django, Flask, Bottle, WSGI, CGI…
Antworten
4fersen
User
Beiträge: 11
Registriert: Samstag 28. März 2020, 21:47
Wohnort: 127.0.0.1

Hallo Leute,
ich saß jetzt schon unzählige Stunden daran, das Problem zu beheben, doch ich bekomme es einfach nicht hin, trotz zahlreichen Ergebnissen zu diesem Fehler welche man in Google findet.

Meinen Apache2 Server hoste ich auf eine Debian 9 Server und benutze Flask.

Der Fehler tritt auf, wenn sich ein neuer User zu registrieren versucht.

Ich habe bereits versucht, dem Ordner in welchem die Datenbank liegt alle Recht zu gewähren, der Datenbank an sich. Den darüberliegenden Ordnern, dem .wsgi file, welche den Python Code startet.

Die Rechte habe ich den Ordnern / Dateien so zugewiesen:

Code: Alles auswählen

chmod 777 /var/www/html/webApp
chmod 777 /var/www/html/webApp/users.sqlite3
Nach dem zuweisen, habe ich auch paar mal den Apache2 Server neugestartet sowie den kompletten VPS.

Ich hoffe wirklich jemand kann mir weiterhelfen!

Liebe Grüße
4fersen
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Was ist denn die konkrete Fehlermeldung? Wie sieht der Code aus?

Was auf keinen Fall geht, ist, unterhalb von /var/www Datenbanken oder gar das Python-Programm abzulegen. Das gehört in einen Bereicht, auf den Apache keinen Zugriff hat.
4fersen
User
Beiträge: 11
Registriert: Samstag 28. März 2020, 21:47
Wohnort: 127.0.0.1

Wo sollte ich den am besten den python script hinterlegen wenn nicht in "www" und auch nicht in den unter Ordnern? Meine Struktur sieht bis jetzt so aus:

Code: Alles auswählen

/var/www/html/webApp/webapp.wsgi # Hier wird der Python-Code gestartet
/var/www/html/webApp/webApp/__init__.p
Ich habe ein paar Anleitungen im Internet gefunden, welche genau diese Struktur empfehlen.

Code: Alles auswählen

@app.route('/register', methods=["POST", "GET"])
def register():
    if 'email' in session:
        flash('Sie sind bereits eingelogt')
        return redirect(url_for('home'))
    elif request.method == "POST":
        email = request.form['email'].lower()
        password = request.form['password']

        if email != '' and password != '':
            if User.query.filter_by(email=email).first() is None:
                print(f'User "{email}" noch nicht registriert')
                db.session.add(User(email, password, ))
                db.session.flush()
                db.session.commit()
Ich weiß, das Passwort wird bis jetzt noch im Klartext gespeichert, dies werde ich noch ändern ;)


Kompletter Traceback

Code: Alles auswählen

[Mon Feb 22 10:42:09.312811 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934] Traceback (most recent call last):
[Mon Feb 22 10:42:09.312813 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]   File "/usr/local/lib/python3.7/dist-packages/flask/app.py", line 2447, in wsgi_app
[Mon Feb 22 10:42:09.312815 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]     response = self.full_dispatch_request()
[Mon Feb 22 10:42:09.312817 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]   File "/usr/local/lib/python3.7/dist-packages/flask/app.py", line 1952, in full_dispatch_request
[Mon Feb 22 10:42:09.312819 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]     rv = self.handle_user_exception(e)
[Mon Feb 22 10:42:09.312821 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]   File "/usr/local/lib/python3.7/dist-packages/flask/app.py", line 1821, in handle_user_exception
[Mon Feb 22 10:42:09.312823 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]     reraise(exc_type, exc_value, tb)
[Mon Feb 22 10:42:09.312825 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]   File "/usr/local/lib/python3.7/dist-packages/flask/_compat.py", line 39, in reraise
[Mon Feb 22 10:42:09.312827 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]     raise value
[Mon Feb 22 10:42:09.312829 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]   File "/usr/local/lib/python3.7/dist-packages/flask/app.py", line 1950, in full_dispatch_request
[Mon Feb 22 10:42:09.312831 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]     rv = self.dispatch_request()
[Mon Feb 22 10:42:09.312832 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]   File "/usr/local/lib/python3.7/dist-packages/flask/app.py", line 1936, in dispatch_request
[Mon Feb 22 10:42:09.312834 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]     return self.view_functions[rule.endpoint](**req.view_args)
[Mon Feb 22 10:42:09.312839 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]   File "/var/www/webApp/webApp/__init__.py", line 389, in register
[Mon Feb 22 10:42:09.312841 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]     db.session.flush()
[Mon Feb 22 10:42:09.312843 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]   File "/usr/local/lib/python3.7/dist-packages/sqlalchemy/orm/scoping.py", line 163, in do
[Mon Feb 22 10:42:09.312845 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]     return getattr(self.registry(), name)(*args, **kwargs)
[Mon Feb 22 10:42:09.312847 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]   File "/usr/local/lib/python3.7/dist-packages/sqlalchemy/orm/session.py", line 2540, in flush
[Mon Feb 22 10:42:09.312849 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]     self._flush(objects)
[Mon Feb 22 10:42:09.312851 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]   File "/usr/local/lib/python3.7/dist-packages/sqlalchemy/orm/session.py", line 2682, in _flush
[Mon Feb 22 10:42:09.312853 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]     transaction.rollback(_capture_exception=True)
[Mon Feb 22 10:42:09.312855 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]   File "/usr/local/lib/python3.7/dist-packages/sqlalchemy/util/langhelpers.py", line 70, in __exit__
[Mon Feb 22 10:42:09.312857 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]     with_traceback=exc_tb,
[Mon Feb 22 10:42:09.312858 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]   File "/usr/local/lib/python3.7/dist-packages/sqlalchemy/util/compat.py", line 182, in raise_
[Mon Feb 22 10:42:09.312860 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]     raise exception
[Mon Feb 22 10:42:09.312862 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]   File "/usr/local/lib/python3.7/dist-packages/sqlalchemy/orm/session.py", line 2642, in _flush
[Mon Feb 22 10:42:09.312864 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]     flush_context.execute()
[Mon Feb 22 10:42:09.312866 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]   File "/usr/local/lib/python3.7/dist-packages/sqlalchemy/orm/unitofwork.py", line 422, in execute
[Mon Feb 22 10:42:09.312868 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]     rec.execute(self)
[Mon Feb 22 10:42:09.312870 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]   File "/usr/local/lib/python3.7/dist-packages/sqlalchemy/orm/unitofwork.py", line 589, in execute
[Mon Feb 22 10:42:09.312872 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]     uow,
[Mon Feb 22 10:42:09.312874 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]   File "/usr/local/lib/python3.7/dist-packages/sqlalchemy/orm/persistence.py", line 245, in save_obj
[Mon Feb 22 10:42:09.312878 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]     insert,
[Mon Feb 22 10:42:09.312880 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]   File "/usr/local/lib/python3.7/dist-packages/sqlalchemy/orm/persistence.py", line 1136, in _emit_insert_statements
[Mon Feb 22 10:42:09.312882 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]     statement, params
[Mon Feb 22 10:42:09.312884 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]   File "/usr/local/lib/python3.7/dist-packages/sqlalchemy/engine/base.py", line 1011, in execute
[Mon Feb 22 10:42:09.312886 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]     return meth(self, multiparams, params)
[Mon Feb 22 10:42:09.312888 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]   File "/usr/local/lib/python3.7/dist-packages/sqlalchemy/sql/elements.py", line 298, in _execute_on_connection
[Mon Feb 22 10:42:09.312890 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]     return connection._execute_clauseelement(self, multiparams, params)
[Mon Feb 22 10:42:09.312892 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]   File "/usr/local/lib/python3.7/dist-packages/sqlalchemy/engine/base.py", line 1130, in _execute_clauseelement
[Mon Feb 22 10:42:09.312894 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]     distilled_params,
[Mon Feb 22 10:42:09.312896 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]   File "/usr/local/lib/python3.7/dist-packages/sqlalchemy/engine/base.py", line 1317, in _execute_context
[Mon Feb 22 10:42:09.312898 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]     e, statement, parameters, cursor, context
[Mon Feb 22 10:42:09.312900 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]   File "/usr/local/lib/python3.7/dist-packages/sqlalchemy/engine/base.py", line 1511, in _handle_dbapi_exception
[Mon Feb 22 10:42:09.312902 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]     sqlalchemy_exception, with_traceback=exc_info[2], from_=e
[Mon Feb 22 10:42:09.312904 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]   File "/usr/local/lib/python3.7/dist-packages/sqlalchemy/util/compat.py", line 182, in raise_
[Mon Feb 22 10:42:09.312906 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]     raise exception
[Mon Feb 22 10:42:09.312908 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]   File "/usr/local/lib/python3.7/dist-packages/sqlalchemy/engine/base.py", line 1277, in _execute_context
[Mon Feb 22 10:42:09.312910 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]     cursor, statement, parameters, context
[Mon Feb 22 10:42:09.312912 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]   File "/usr/local/lib/python3.7/dist-packages/sqlalchemy/engine/default.py", line 608, in do_execute
[Mon Feb 22 10:42:09.312914 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934]     cursor.execute(statement, parameters)
[Mon Feb 22 10:42:09.312918 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934] sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) attempt to write a readonly database
[Mon Feb 22 10:42:09.312920 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934] [SQL: INSERT INTO user (email, password, bestellungen, paypal_adresse, amazon_profil_link, tokens, earned, affilates, guthaben) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)]
[Mon Feb 22 10:42:09.312922 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934] [parameters: ('asdasdasd', 'asdasdasd', '[]', '', '', 1, 0, '[]', 0)]
[Mon Feb 22 10:42:09.312924 2021] [wsgi:error] [pid 1169:tid 139865593173760] [client 141.101.99.92:51934] (Background on this error at: http://sqlalche.me/e/13/e3q8)
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Naja, wenn man etwas in /var/www/html ablegt, dann besteht immer die Gefahr, dass jemand von außen direkt die Datenbank liest.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Und dann auch noch jedem Schreibrechte geben ist auch keine gute Idee. Setz Dich ordentlich mit den Rechten auseinander und erlaube nur Schreibrechte für Benutzer/Gruppen die da auch wirklich das Recht für brauchen und nicht einfach für jeden.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Ich hoffe mal das im User Model auch noch mehr mit dem Passwort passiert. Das in der Datenbank zu speichern wäre nämlich ein Sicherheitsproblem.
4fersen
User
Beiträge: 11
Registriert: Samstag 28. März 2020, 21:47
Wohnort: 127.0.0.1

DasIch hat geschrieben: Montag 22. Februar 2021, 16:19 Ich hoffe mal das im User Model auch noch mehr mit dem Passwort passiert. Das in der Datenbank zu speichern wäre nämlich ein Sicherheitsproblem.
Das hatte ich beim erstellen das Beitrages bereits erwähnt, das werde ich noch ändern. Trotzdem vielen Dank für den Hinweis.

Ich habe nun die Datenbank in einen anderen Ordner außerhalb von "www" verschoben. Dort habe ich wieder diese Befehle angewendet:

Code: Alles auswählen

chmod 777 users.sqlite3
chown www-data webseite_data/

Und ich erhalte wieder den selben Fehler.. wieder hat der Server keine Schreibrechte
4fersen
User
Beiträge: 11
Registriert: Samstag 28. März 2020, 21:47
Wohnort: 127.0.0.1

Ich habe nun auch einmal die Datenbank gelöscht und versucht das der Server von selbst die Datenbank erstellt und hierfür fehlen anscheinend auch schon die Schreibrechte.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Zeig doch mal den Code und Deine Verzeichnisstruktur.
4fersen
User
Beiträge: 11
Registriert: Samstag 28. März 2020, 21:47
Wohnort: 127.0.0.1

Sirius3
Hier ist der vollständige Code:

Code: Alles auswählen

#!/usr/bin/python3
# coding: utf8
import threading
from datetime import timedelta
import time
from flask import Flask, redirect, url_for, render_template, request, session, flash
from flask_sqlalchemy import SQLAlchemy
from flask_caching import Cache
# import traceback
# from flask_wtf.file import FileAllowed
from werkzeug.utils import secure_filename

app = Flask(__name__)
app.secret_key = "&!pJD+M=kpL=Z?7sm8=dF!2S7xXvVkb-ZWDN*a=r_nJEcE5?fy#FhLWw=TgG^xRG73hSm8drw-K^*6ww=SYM8hM8xc!ckXWC_=Hw"
import os

# app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://' + os.path.join("sparferkeln", 'users.sqlite3')
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.sqlite3'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
cache = Cache(app, config={'CACHE_TYPE': 'simple'})

app.permanent_session_lifetime = timedelta(days=7)
db = SQLAlchemy(app)

Code: Alles auswählen

@app.route('/register', methods=["POST", "GET"])
def register():
    if 'email' in session:
        flash('Sie sind bereits eingelogt')
        return redirect(url_for('home'))
    elif request.method == "POST":
        email = request.form['email'].lower()
        password = request.form['password']

        if email != '' and password != '':
            if User.query.filter_by(email=email).first() is None:
                print(f'User "{email}" noch nicht registriert')
                db.session.add(User(email, password, ))
                db.session.flush()
                db.session.commit()

/var/www/webApp/webapp.wsgi
/var/www/webApp/webApp/__init__.py

Datenbank habe ich nun in diesen Ordner verschoben:
/sparferkeln/users.sqlite3

Aber auch wenn die Datenbank im selben Ordner wie die __init_.py oder in dem Ordner wo die .wsgi Datei liegt, hat der Server keine Schreibrechte.

Falls jemand mir bei der Lösung des Problems behilflich seien kann, wäre ich auch bereit ein paar Groschen zu bezahlen.

Liebe Grüße
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

@4fersen: Was du beschreibst, passt nicht zum Code. Dein Code verwendet die Datenbank '/users.sqlite3'. Das sucht die Datei nicht im selben Verzeichnis wie dein Script sondern entsprechend im root-Verzeichnis des Systems.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Was auch fehlende Rechte erklären könnte. 😉
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
4fersen
User
Beiträge: 11
Registriert: Samstag 28. März 2020, 21:47
Wohnort: 127.0.0.1

@sparrow, da hab ich wohl vergessen den Pfad auszutauschen, bevor ich es hier gepostet habe. Auf jeden Fall funktioniert beides nicht wenn die Datei im selben Ordner wie die __init__.py datei liegt, hat der Server keine Rechte, sowie wenn die Datei im Ordner "sparferkeln" liegt. Beides funktioniert nicht.

Also falls sich jemand etwas dazuverdienen möchte, kann er mir hier auch über das Forum eine Mail zukommen lassen
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Verwende doch mal den absoluten Pfad:

Code: Alles auswählen

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///absoluter/pfad/zur/datei/users.sqlite3'
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

@4fersen: zeig doch einfach den Code, wie er wirklich ist und die dazugehörige Fehlermeldung.
Weil ich aus deiner Antwort nicht sehe, ob du das Problem vestanden hast: Der Code sucht die Datenbank im root-Verzeichnis des Systems, nicht dort wo das Script liegt.
Antworten