Wie bau ich mir mit Bottle am besten ein Login-System?
Aus den kleinen Codeauszug bzgl Sessions in der FAQ von der Bottleseite werde ich nicht ganz schlau.
DAnke für eure Hilfe.
[bottle] Loginsystem
Ahh hab gerade das Logging module gefunden:
http://docs.python.org/library/logging.html
werde es mir mal angucken.
http://docs.python.org/library/logging.html
werde es mir mal angucken.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Ist jetzt keine direkte Lösung, aber nach den Problemen, die Du hier schon hattest, willst Du Dir evtl. doch mal flask angucken. Das bietet Dir ein eigenes Session-System und in der Doku ist das auch gut erklärt.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Du kannst auch einfach mit der session middleware arbeiten.
Da sollte auch ein Beispiel zu finden sein...
Edit: Ha, wer sagts denn: http://bottle.paws.de/page/faq
Da sollte auch ein Beispiel zu finden sein...
Edit: Ha, wer sagts denn: http://bottle.paws.de/page/faq
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Genau das hat der OP ja nicht verstandenjbs hat geschrieben: Edit: Ha, wer sagts denn: http://bottle.paws.de/page/faq

encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Mal wieder zu schnell gelesen 
Zur FAQ:
Du brauchst eine Middleware, da bottle selber keine Session anbietet. Das heißt du schaltest was dazwischen, dass das kann. Es ändert sich aber das app Objekt, da es ja nun auch sessions verwalten soll. Diese app musst du bottle dann bekannt machen.
Wie man die Middleware nutzt, liest du dann hier nach: http://beaker.groovie.org/sessions.html

Zur FAQ:
Du brauchst eine Middleware, da bottle selber keine Session anbietet. Das heißt du schaltest was dazwischen, dass das kann. Es ändert sich aber das app Objekt, da es ja nun auch sessions verwalten soll. Diese app musst du bottle dann bekannt machen.
Wie man die Middleware nutzt, liest du dann hier nach: http://beaker.groovie.org/sessions.html
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
- noisefloor
- User
- Beiträge: 4179
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
was willst du den loggen?
BTW: wenn du auch "Aktionen" der Nutzer loggen willst, brauchst wohl zusätzlich zum Logging ein Log-In.
Gruß, noisefloor
was willst du den loggen?
BTW: wenn du auch "Aktionen" der Nutzer loggen willst, brauchst wohl zusätzlich zum Logging ein Log-In.

Gruß, noisefloor
Eigentlich nichts. Hab mich nur verschrieben *hehe*was willst du den loggen?
Noch mal zum Thema: LOGIN

Ich habe mir nun mal diese Middleware Beaker angeguckt bzw. auch eingespielt.
Und das Beispiel da auf der Seite verstehe ich auch fast außer:
Code: Alles auswählen
start_response('200 OK', [('Content-type', 'text/plain')])
Naja auf jeden Fall die Frage , die ich mir stelle ist:
Wie ich eine Session starte und fülle und abfrage (im .py), sollte soweit klar sein aber wie schütze ich denn meine generierten html Seiten?
Wenn ich z.B. eine Adminseite mache, muss ich doch vorher irgendwie abfragen können ob ne Session existiert oder nicht, damit er ggf. den Inhalt NICHT lädt.
Niemand ne Idee wie man eine Login-Abfrage für den Adminbereich meines Gästebuches lösen kann?
Also nochmal zur Erkärung:
Ich habe eine Seite /admin wo Links generiert werden:
Lösche Beitrag X
Lösche Beitrag X
Lösche Beitrag X
Lösche Beitrag X
Lösche Beitrag X
So diese Links sollen dritte Person nicht sehen geschweige nicht ausführen.
D.h. er soll die Seite nur generieren wenn man sich eingeloggt hat.
Und ansonsten einfach wieder zur Startseite umlenken oder ne Error-Meldung ausgeben.
In PHP kann man oben im Html-Dokument bzw. php file abfragen , ob ne Session gestartet wurde oder nicht.
Also nochmal zur Erkärung:
Ich habe eine Seite /admin wo Links generiert werden:
Lösche Beitrag X
Lösche Beitrag X
Lösche Beitrag X
Lösche Beitrag X
Lösche Beitrag X
So diese Links sollen dritte Person nicht sehen geschweige nicht ausführen.
D.h. er soll die Seite nur generieren wenn man sich eingeloggt hat.
Und ansonsten einfach wieder zur Startseite umlenken oder ne Error-Meldung ausgeben.
In PHP kann man oben im Html-Dokument bzw. php file abfragen , ob ne Session gestartet wurde oder nicht.
- noisefloor
- User
- Beiträge: 4179
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
du kannst das über eine verschlüsselten Cookie lösen, in dem dann z.B. der Nutzername gespeichert wird in bei bestimmten Seiten geprüft wird, ob dieser Nutzer berechtigt ist, sie zu sehen.
Wenn die Anwendnungen auf einem Webserver läuft kannst du auch Auth-Basic Infos mit Bottle auswerten.
Gruß, noisefloor
du kannst das über eine verschlüsselten Cookie lösen, in dem dann z.B. der Nutzername gespeichert wird in bei bestimmten Seiten geprüft wird, ob dieser Nutzer berechtigt ist, sie zu sehen.
Wenn die Anwendnungen auf einem Webserver läuft kannst du auch Auth-Basic Infos mit Bottle auswerten.
Gruß, noisefloor
Ok und wie verschlüssel ich den richtig? Hab schon alles mögliche versucht aber er zeigt mir trotzdem immer problemlos den Wert an:du kannst das über eine verschlüsselten Cookie lösen, in dem dann z.B. der Nutzername gespeichert wird in bei bestimmten Seiten geprüft wird, ob dieser Nutzer berechtigt ist, sie zu sehen.
Code: Alles auswählen
@route('/test')
def test():
response.set_cookie("mykey", "1234" secret=1)
#return request.get_cookie("mykey")
return request.get_cookie("mykey")
Ah, hab mein Fehler gefunden.
Habs falsch geschrieben.
Aber nun nochmal meine Frage:
Was bringt "secure=True" eigentlich? Da steht in den Cookieeinstellung nur "verschlüsselt". Aber mehr auch nicht.
Ich kann nach wie vor den Cookie_value einsehen.
Frage ist, was bringt der eigentlich?
Zweite Frage:
Wenn ich kein "expires" setze, verfällt der Cookie nach meiner Browsersitzung.
Ist das eine Defaulteinstellung und überall so?
Dritte_Frage:
Gibts ne Funktion, wo ich ein Cookie auf "Knopfdruck" löschen kann?
Habs falsch geschrieben.
Aber nun nochmal meine Frage:
Was bringt "secure=True" eigentlich? Da steht in den Cookieeinstellung nur "verschlüsselt". Aber mehr auch nicht.
Ich kann nach wie vor den Cookie_value einsehen.
Frage ist, was bringt der eigentlich?
Zweite Frage:
Wenn ich kein "expires" setze, verfällt der Cookie nach meiner Browsersitzung.
Ist das eine Defaulteinstellung und überall so?
Dritte_Frage:
Gibts ne Funktion, wo ich ein Cookie auf "Knopfdruck" löschen kann?
@Sync32: Wo kannst Du denn das verschlüsselte Cookie lesen? Ich denke es geht darum, dass der Besucher der Webseite es seinem Browser nicht lesen kann, denn sonst könnte er es ja bei sich einfach so ändern, dass er zum Beispiel Adminrechte in Deiner Webanwendung bekommt.
Warum machst du das nicht in etwa so?
Code: Alles auswählen
users = dict(name='foo', level=1), dict(name='admin', level=0)
import bottle
from bottle import route, run, get
s = lambda: bottle.request.environ.get('beaker.session')
@get('/make-me-admin')
def make_me_admin():
s()['id'] = 1
s().save()
return 'Now you are an admin!'
@get('/secret')
def secret():
id = s().get('id', -1)
print id
if id >= 0 and users[id]['level'] == 0:
return 'Hello Admin'
return 'Not allowed!!!'
from beaker.middleware import SessionMiddleware
app = bottle.default_app()
session_opts = {
'session.type': 'file',
'session.cookie_expires': 300,
'session.data_dir': './data',
'session.auto': True
}
app = SessionMiddleware(app, session_opts)
run(app=app, reloader=True)
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Danke für dein Beispiel.
Hab aber nun auch eine gute Lösung gefunden mit den Cookies.
Hab nur ein Problem:
Wenn ich den Cookie, wie mir empfohlen, verschlüsselt (secure = true) setze, ist er zwar verschlüsselt aber denn kann ich ihn anschließend selber nicht mehr mit
request.get_cookie("mycookie")
auslesen??? Was ich ja muss
Hab aber nun auch eine gute Lösung gefunden mit den Cookies.
Hab nur ein Problem:
Wenn ich den Cookie, wie mir empfohlen, verschlüsselt (secure = true) setze, ist er zwar verschlüsselt aber denn kann ich ihn anschließend selber nicht mehr mit
request.get_cookie("mycookie")
auslesen??? Was ich ja muss
@Sync32: Ist die Frage ernst gemeint!? Natürlich müsstest Du beim Auslesen dann auch den Schlüssel zum entschlüsseln angeben. Wenn das ohne ginge, könnte das ja jeder machen.
@Sync32: Schau Dir mal die Dokumentation von `set_cookie()` und `get_cookie()` an und welche Argumente man da übergeben kann. Wie hast Du denn `set_cookie()` aufgerufen?