Bottle, HTML Datenbankzugriff

Django, Flask, Bottle, WSGI, CGI…
BlackJack

@DanJJo: Für Benutzereinstellungen wenn man eingeloggt ist, gibt es doch in der Regel eine eigene Seite.

Bei Deiner Beschreibung frage ich mich gerade ob Du den Login-Bereich jetzt tatsächlich in jedes Template geschrieben hast? Das sollte man natürlich nicht machen, denn dann muss man den ja an x Stellen verändern, wenn man mal etwas verändern möchte oder muss. Für so etwas gibt es in Templatesystemen so etwas wie Vererbung und/oder „includes” von anderen (Teil)Templates.

Und man kann selbstverständlich auch Weichen mit Bedingungen in ein Template einbauen, zum Beispiel wenn nicht eingeloggt, dann Eingabefelder für Name und Passwort anzeigen, sonst Name und Abmeldeschaltfläche.
Sirius3
User
Beiträge: 18255
Registriert: Sonntag 21. Oktober 2012, 17:20

@DanJJo:
normalerweise erstellt man ein Basis-Template, das den Grundaufbau (Menüzeile, Footer, Login-, bzw. Profil-Link, usw.)
Die eigentlichen Seiten binden jeweils dieses Template ein.
Im Basis-Template wird über %if loggedin ... entschieden, was ein eingeloggter und ein nichteingeloggter Benutzer für Links sieht.
DanJJo
User
Beiträge: 90
Registriert: Mittwoch 13. Februar 2013, 18:35

Ok super ja danke hab ich verstanden und angefangen neu zu strukturieren jetzt aber noch eine frage...

hab nun

Code: Alles auswählen

					%if logged:
					  %name="siggned"
					  %_include (name, _stdout=_stdout, a='benutzerkonto')
					%else:
					  %name="logregi"
					  %_include (name, _stdout=_stdout, a='login', b='register')
logged = request.get_cookie("account", secret='DuundIch') wäre in der main.py....natürlich kennt er im *.tpl logged nicht...wie wär der asuweg?
BlackJack

@DanJJo: Der Ausweg wäre natürlich das mit den anderen Daten ans Template zu übergeben.
DanJJo
User
Beiträge: 90
Registriert: Mittwoch 13. Februar 2013, 18:35

läuft
DanJJo
User
Beiträge: 90
Registriert: Mittwoch 13. Februar 2013, 18:35

weitere Frage....gibt es eine möglichkeit doppelte Einträge in der Datenbank zu vermeiden ohne alles mit 'if's" regeln zu müssen?
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

DanJJo hat geschrieben:weitere Frage....gibt es eine möglichkeit doppelte Einträge in der Datenbank zu vermeiden ohne alles mit 'if's" regeln zu müssen?
Definiere das Feld oder die Felder als UNIQUE und fange nach dem fehlgeschlagenen Einfügen den Fehler ab.
DanJJo
User
Beiträge: 90
Registriert: Mittwoch 13. Februar 2013, 18:35

danke wieder mal und...

Ich wieder mal

gibt es in Bottlepy eine möglichkeit "switch:case" wie in java zu simulieren?

müsste sonst 32 if abfragen schreiben :|
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

DanJJo hat geschrieben:gibt es in Bottlepy eine möglichkeit "switch:case" wie in java zu simulieren?

müsste sonst 32 if abfragen schreiben :|
In Python nutzt man dafür Dictionaries.
Das Leben ist wie ein Tennisball.
DanJJo
User
Beiträge: 90
Registriert: Mittwoch 13. Februar 2013, 18:35

Ich hab da mal eine Frage zu einer SQL abfrage. Angenommen ich habe folgende Tabellen

Wagen values (Name,Modell,...) , User values(Name,...) , Favorisiert values(UserName,WagenName,..)

Nun würde ich gerne eine Tabelle ausgeben, die Beinhaltet:
WagenName, Anz.der.Fav. -

leider komme ich da nicht hin :(

meine Ansätze

SELECT Wagen.Name, Count(Wagen.Name) FROM Wagen, User, Favorisiert WHERE User.Name=Favorisiert.UserName AND Wagen.Name = Favorisiert.WagenName.

mir ist klar, dass er bei Count(Wagen.Name) die Anzahl der Wagen Zählt, die in der Tabelle stehen aber nicht die jeweilige Anz für jeden einzelnen Wagentyp.
Ich denke, dass ich in der "Count" anweisung meine Wagen zaehlen muss aber wie nur?! kann mir da bitte einer helfen. Danke
Zuletzt geändert von DanJJo am Mittwoch 27. Februar 2013, 13:02, insgesamt 1-mal geändert.
BlackJack

@DanJJo: Das sollte eigentlich überhaupt nicht nötig sein wenn Du bei Texten durchgehend mit dem `unicode`-Typ arbeitest. Vor allem sollte eine Abfrage immer ein `unicode`-Objekt liefern.

Code: Alles auswählen

In [14]: cur.execute('select Vorname, Nachname from personen')
Out[14]: <sqlite3.Cursor at 0x8fddaa0>

In [15]: cur.fetchall()
Out[15]: [(u'Max', u'Mustermann')]
Und beim Eintragen erwartet SQLite UTF-8 kodierte `str`-Objekte oder `unicode`-Objekte.

Etwas global zu definieren, so dass alle Kodierungen auf magische Weise passieren geht nicht. Die „magic line” gibt an wie der Quelltext kodiert ist und muss mit der tatsächlichen Kodierung des Quelltextes überein stimmen. Das ist aber nur für den Compiler wichtig, zur Laufzeit hat diese Angabe keine Auswirkung.
DanJJo
User
Beiträge: 90
Registriert: Mittwoch 13. Februar 2013, 18:35

Super Danke.

Ich hab da mal eine Frage zu einer SQL abfrage. Angenommen ich habe folgende Tabellen

Wagen values (Name,Modell,...) , User values(Name,...) , Favorisiert values(UserName,WagenName,..)

Nun würde ich gerne eine Tabelle ausgeben, die Beinhaltet:
WagenName, Anz.der.Fav. -

leider komme ich da nicht hin :(

meine Ansätze

SELECT Wagen.Name, Count(Wagen.Name) FROM Wagen, User, Favorisiert WHERE User.Name=Favorisiert.UserName AND Wagen.Name = Favorisiert.WagenName.

mir ist klar, dass er bei Count(Wagen.Name) die Anzahl der Wagen Zählt, die in der Tabelle stehen aber nicht die jeweilige Anz für jeden einzeln
Sirius3
User
Beiträge: 18255
Registriert: Sonntag 21. Oktober 2012, 17:20

Code: Alles auswählen

select WagenName, count(*) from Favorisiert group by WagenName
DanJJo
User
Beiträge: 90
Registriert: Mittwoch 13. Februar 2013, 18:35

AH mit group by. Danke :)
BlackJack

Wobei jetzt in der `Favorisiert`-Tabelle hoffentlich nicht wirklich die Benutzer- und Wagen*namen* stehen.
Sirius3
User
Beiträge: 18255
Registriert: Sonntag 21. Oktober 2012, 17:20

@ DanJJo: normalerweise hat jede Tabelle eine Spalte ID als primary key der zum Querverweis auf andere Tabellen benutzt wird.

Code: Alles auswählen

SELECT Wagen.Name, count(*) FROM Wagen, Favorisiert WHERE Wagen.id=Favorisiert.Wagen_Id GROUP BY Wagen_Id
DanJJo
User
Beiträge: 90
Registriert: Mittwoch 13. Februar 2013, 18:35

ich bin ja klein und fang grad erst an etwas rum zu testen :roll: also verzeih mir, dass es noch nicht optimal ist blackjack

Ich habe ein Syntaktisches Problem....

folgendes:
Ich habe ein dict mit mehreren enden.

Code: Alles auswählen

look = { "1" : "in (SELECT AutoName FROM Wagen WHERE WagenName LIKE ?),('%'+import+'%',)" ....}
<- import ist hierbei etwas, das ich aus meinem tpl bekomme

und einen festen Anfangsstring.

Code: Alles auswählen

anfangsstring="""SELECT AutoName,ps,hubraum FROM Wagen WHERE WagenName """
anfangsstring+=look.get("1", "1"))
cur=db.execute(anfangsstring)
nun bekomm ich aber immer die meldung, dass die syntax nicht stimmt...liegt es an dem "import" ? dass das nicht funktioniert oder sollte das eigentlich kein problem sein?
BlackJack

@DanJJo: Das liegt daran, dass Du in der Zeichenkette SQL- und Python-Syntax vermischst. Und die Datenbank kann mit dem Teil, den Du für Python verwenden müsstest, nichts anfangen. So ein Funktionsaufruf mit einer Variablen als Argument ist keine textuelle Ersetzung und das Ausführen des Ergebnisses als Python-Quelltext.

Ich denke es ist die Stelle in der Entwicklung erreicht, in der Du dringend über SQLAlchemy nachdenken solltest, um Anfragen nicht aus Zeichenketten zusammen zu basteln.
DanJJo
User
Beiträge: 90
Registriert: Mittwoch 13. Februar 2013, 18:35

BlackJack hat geschrieben:@DanJJo: Das liegt daran, dass Du in der Zeichenkette SQL- und Python-Syntax vermischst. Und die Datenbank kann mit dem Teil, den Du für Python verwenden müsstest, nichts anfangen. So ein Funktionsaufruf mit einer Variablen als Argument ist keine textuelle Ersetzung und das Ausführen des Ergebnisses als Python-Quelltext.

Ich denke es ist die Stelle in der Entwicklung erreicht, in der Du dringend über SQLAlchemy nachdenken solltest, um Anfragen nicht aus Zeichenketten zusammen zu basteln.
hmpf also besteht gar keine möglichkeit mit der überlegung, die ich hatte ?! :|
BlackJack

@DanJJo: Jain. *So* natürlich nicht, Du müsstest im Wörterbuch zwei Sachen hinterlegen: SQL-(Teil)Ausdruck und Wert der Eingesetzt werden soll (oder eine Funktion die diesen Wert errechnet). Wobei ``('%'+import+'%',)`` als Python-Quelltext natürlich nicht geht, weil Namen keine Python-Schlüsselwörter sein dürfen. Das heisst Du hättest diesem Namen vorher auch gar keinen Wert zuweisen können.

SQLAlchemy ist aber trotzdem besser, weil man damit deutlich schwieriger syntaktisch falsches SQL erzeugen kann (solange man nicht absichtlich „rohe” SQL-Teilausdrücke einbaut).
Antworten