HTML, PyScript und MySQL - ConnectionError

Django, Flask, Bottle, WSGI, CGI…
Antworten
SuitSmile
User
Beiträge: 7
Registriert: Freitag 13. August 2021, 18:30

Guten Abend zusammen,

ich hänge schon ein paar Tage an einem Problem und wollte jetzt mal gucken, ob mir jemand von euch vlt. effizienter helfen kann.

Zu meinem System:
Ich habe ein Ubuntu-22.04-Server gemietet, den ich als Webserver nutze.
Auf diesem System läuft ein MySQL-Server.

Mein Ziel ist mit PyScript eine Verbindung zu MySQL herzustellen, um unter anderem auf meiner Webseite eine Eingabe zu tätigen und damit Daten in eine Datenbank zu lesen oder zu schreiben.

Daraufhin bekomme ich leider folgende Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "/lib/python3.11/site-packages/mysql/connector/network.py", line 733, in open_connection
    self.sock.connect(sockaddr)
BlockingIOError: [Errno 26] Operation in progress

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<exec>", line 11, in <module>
  File "/lib/python3.11/site-packages/mysql/connector/pooling.py", line 294, in connect
    return MySQLConnection(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/lib/python3.11/site-packages/mysql/connector/connection.py", line 169, in __init__
    self.connect(**kwargs)
  File "/lib/python3.11/site-packages/mysql/connector/abstracts.py", line 1217, in connect
    self._open_connection()
  File "/lib/python3.11/site-packages/mysql/connector/connection.py", line 575, in _open_connection
    self._socket.open_connection()
  File "/lib/python3.11/site-packages/mysql/connector/network.py", line 735, in open_connection
    raise InterfaceError(
mysql.connector.errors.InterfaceError: 2003: Can't connect to MySQL server on '127.0.0.1:3306' (26 Operation in progress)
Soweit ja erstmal raus zu lesen, dass es etwas mit einem meiner Interfaces zu tun hat.
Habe die Meldung auch in verschiedenen Formen gegoogelt, aber leider bin ich zu keiner Lösung gekommen.

Hier der Code, mit dem ich auf die Datenbank zugreife:

Code: Alles auswählen

import os

import mysql.connector as conn
from mysql.connector import Error

try:
    connection = conn.connect(host = '127.0.0.1', 
                                        user = "<user>", 
                                        password = "<passwort>", 
                                        database = "<datenbank>")
    
    user_input = connection.cursor(named_tuple=True)
    user_input.execute(f"select * from users;")

    for i in user_input:
        datei = open('python/error.log','a')
        datei.write(str(i) + " - Input \n")


except Error as e:
    datei = open(f'python/error.log','a')
    datei.write(str(e) + " - Error \n")
Habe auch schon versucht das selber nen bisel zu Debuggen, aber leider ebenfalls ohne Erfolg. (Das schreiben in die error.log Datei)

Nochmal als Zusatz:
Ich nutze VS Code und wenn ich dort den Python Code direkt ausführe, klappt die Datenbankverbindung ohne Probleme.

Wenn ihr vlt. direkt seht, was bei meinem Problem fehlt, wäre ich für jede Hilfe dankbar.

Sollten noch relevante Informationen dazu fehlen, ergänze ich diese selbstverständlich gerne.

Grüße Benni
Sirius3
User
Beiträge: 17830
Registriert: Sonntag 21. Oktober 2012, 17:20

Liegt vielleicht daran, dass Du ständig Dateien öffnest, ohne sie wieder zu schließen. Für Dateien (und Datenbanken) sollte man immer das with-Statement verwenden. Dateien öffnet man einmal und schreibt dann alles auf einmal und öffnet nicht für jeden Datensatz die Datei erneut. `i` ist ein sehr schlechter Variablename für einen `user`.
Warum verwendest Du f-Strings wo sie unnötig sind und dort wo sie sinnvoll sind nicht?
Benutzeravatar
__blackjack__
User
Beiträge: 13242
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@SuitSmile: Der gezeigte Quelltext passt nicht zur gezeigten Ausnahme weil die Ausnahme komplett mit Traceback ist, der gezeigte Code das aber durch die Ausnahmebehandlung unterdrückt und nur die Meldung ohne Traceback in eine Datei schreibt.

Fürs Logging schreibt man sich besser keinen eigenen Code sondern verwendet das `logging`-Modul aus der Standardbibliothek oder etwas externes wie `loguru`. Beide genannte Bibliotheken erlauben das Protokollieren des kompletten Traceback.
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
SuitSmile
User
Beiträge: 7
Registriert: Freitag 13. August 2021, 18:30

Sirius3 hat geschrieben: Montag 24. Juli 2023, 05:33 Liegt vielleicht daran, dass Du ständig Dateien öffnest, ohne sie wieder zu schließen. Für Dateien (und Datenbanken) sollte man immer das with-Statement verwenden. Dateien öffnet man einmal und schreibt dann alles auf einmal und öffnet nicht für jeden Datensatz die Datei erneut. `i` ist ein sehr schlechter Variablename für einen `user`.
Warum verwendest Du f-Strings wo sie unnötig sind und dort wo sie sinnvoll sind nicht?
Hallo Sirius3,

danke für deine Antwort, aber ich meinte ja schon, dass es nicht daran liegen kann, weil der Code unabhängig von HTML und PyScript, also direkt mit Python ohne Probleme funktioniert.

Und ja mir ist bewusst, dass das nicht die die eleganteste Lösung ist dafür, aber um mal schnell sich den Output anzuzeigen reicht es meistens.
SuitSmile
User
Beiträge: 7
Registriert: Freitag 13. August 2021, 18:30

__blackjack__ hat geschrieben: Montag 24. Juli 2023, 07:59 @SuitSmile: Der gezeigte Quelltext passt nicht zur gezeigten Ausnahme weil die Ausnahme komplett mit Traceback ist, der gezeigte Code das aber durch die Ausnahmebehandlung unterdrückt und nur die Meldung ohne Traceback in eine Datei schreibt.

Fürs Logging schreibt man sich besser keinen eigenen Code sondern verwendet das `logging`-Modul aus der Standardbibliothek oder etwas externes wie `loguru`. Beide genannte Bibliotheken erlauben das Protokollieren des kompletten Traceback.
Hallo __blackjack__,

danke für deine Antwort. Die zusehende Error-Meldung wird nicht in die Datei geschrieben. Die Meldung hat PyScript direkt als Error auf der Webseite angezeigt.

Bei der Datei gebe ich dir recht, da wird nur die Meldung ohne Traceback hineingeschrieben.
Benutzeravatar
__blackjack__
User
Beiträge: 13242
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ähm, kann man mit PyScript überhaupt (BSD/UNIX-)Socketverbindungen zu *irgendwas* aufbauen? Und die nächste Frage: will man das? Das bedeutet ja, dass man die Zugangsdaten zur Datenbank an den Client überträgt und der direkt an die Datenbank kann, also die Datenbank direkt über das Internet ansprechbar wäre.
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
SuitSmile
User
Beiträge: 7
Registriert: Freitag 13. August 2021, 18:30

__blackjack__ hat geschrieben: Montag 24. Juli 2023, 10:55 Ähm, kann man mit PyScript überhaupt (BSD/UNIX-)Socketverbindungen zu *irgendwas* aufbauen? Und die nächste Frage: will man das? Das bedeutet ja, dass man die Zugangsdaten zur Datenbank an den Client überträgt und der direkt an die Datenbank kann, also die Datenbank direkt über das Internet ansprechbar wäre.
Hatte ich mir schon gedacht, dass das nen Problem sein könnte.
Natürlich möchte ich das nicht, nur war da mein Gedanke: erstmal gucken, ob es geht und dann wie ich die Sicherheit gewährleisten kann.

Was ist deiner Meinung nach die effektivste bzw. schlauste Methode mit einer Datenbank zu arbeiten?

Kann ich mit Python programmieren und dennoch eine Datenbank anbinden?
Sirius3
User
Beiträge: 17830
Registriert: Sonntag 21. Oktober 2012, 17:20

@SuitSmile: ein sauberer Umgang mit Resourcen hat nichts damit zu tun, ob man schnell mal was anzeigt, weil es genauso aufwändig ist, es richtig zu machen, als es falsch zu machen.

Ich hatte überlesen, dass Du PyScript benutzt. Das läuft im Browser, dann ist es wohl sehr gut, dass Du keine Verbindung zu Deiner Datenbank herstellen kannst. Das ist nämlich im Normalfall ein riesiges Sicherheitsproblem. Datenbankzugriffe kapselt man immer hinter einer schönen (REST-)Schnittstelle.
SuitSmile
User
Beiträge: 7
Registriert: Freitag 13. August 2021, 18:30

Sirius3 hat geschrieben: Montag 24. Juli 2023, 11:01 @SuitSmile: ein sauberer Umgang mit Resourcen hat nichts damit zu tun, ob man schnell mal was anzeigt, weil es genauso aufwändig ist, es richtig zu machen, als es falsch zu machen.

Ich hatte überlesen, dass Du PyScript benutzt. Das läuft im Browser, dann ist es wohl sehr gut, dass Du keine Verbindung zu Deiner Datenbank herstellen kannst. Das ist nämlich im Normalfall ein riesiges Sicherheitsproblem. Datenbankzugriffe kapselt man immer hinter einer schönen (REST-)Schnittstelle.
Ok, danke für deinen Hinweis.

Das mit der REST-Schnittstelle ist eine gute idee, ich denke ich werde mich darüber mal etwas mehr schlau machen.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nur weil du schon mit SQL im Browser gestartet bist: es ist nicht ein iota besser, via REST einfach SQL strings ins backend zu schicken. Das ist dann am Ende genauso offen wie eine direkte DB Verbindung. REST APIs sollten anwendungsspezifisch sein, und sowas wie eine Datenbank ist ein Implementationsdetail, dass da gar nicht vorkommt.
Antworten