Getrennte Benutzerdaten WEB2PY

Django, Flask, Bottle, WSGI, CGI…
Antworten
Deeet88
User
Beiträge: 9
Registriert: Donnerstag 23. Dezember 2010, 10:46

Hallo Leute,

ich habe via Web2Py eine kleine Kalenderanwendung geschrieben, bei der man sich einen Account anlegen muss. Dort kann man dann Termine
verwalten.
Problem ist nur jetzt, dass die angelegten Dateien eines Benutzers immer für alle Benutzer sichtbar ist. Alle Benutzer greifen sozusagen auf eine
und die selbe Termindatenbank zu.

Wie krieg ich es theoretisch hin, dass alle Benutzerdaten von einander getrennt sind? Also der Hermann nicht die Termine von der Rosi sehen kann?

Bin noch nicht so der Python Crack, deswegen bin ich für jede Hilfe dankbar! :)

Liebste Grüße
Benutzeravatar
/me
User
Beiträge: 3557
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Deeet88 hat geschrieben:Wie krieg ich es theoretisch hin, dass alle Benutzerdaten von einander getrennt sind? Also der Hermann nicht die Termine von der Rosi sehen kann?

Bin noch nicht so der Python Crack, deswegen bin ich für jede Hilfe dankbar! :)
Na ja, das hat auch weniger mit Python als mit grundsätzlicher Logik zu tun.

Wenn du einen Termin speicherst, dann musst du dabei vermerken, wer ihn angelegt hat. Beim Abrufen der Termine nimmst du dann nur die des aktuell angemeldeten Benutzers.

Wie speicherst du die Daten denn? Datenbank, CSV-Datei, JSON, ...?
Slyx
User
Beiträge: 5
Registriert: Dienstag 17. Mai 2011, 21:23
Wohnort: Trier

Du könntest in deiner Tabelle, in der du die Termine abspeicherst einfach eine Spalte für die Benutzer ID bzw. den Benutzernamen hinzufügen.

Beim Termin anlegen füllst du die Spalte dann einfach mit aus und wenn du die Einträge für einen Benutzer abfragst fügst du ein "WHERE"-Statement mit hinzu.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Slyx hat geschrieben:Du könntest in deiner Tabelle, in der du die Termine abspeicherst einfach eine Spalte für die Benutzer ID bzw. den Benutzernamen hinzufügen.

Beim Termin anlegen füllst du die Spalte dann einfach mit aus und wenn du die Einträge für einen Benutzer abfragst fügst du ein "WHERE"-Statement mit hinzu.
Und wenn der OP keine relationale Datenbank als Backend benutzt? ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Slyx
User
Beiträge: 5
Registriert: Dienstag 17. Mai 2011, 21:23
Wohnort: Trier

@Hyperion: Der OP schrieb etwas von "Termindatenbank", ich gehe also davon aus, dass er keine flatfiles benutzt.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Slyx hat geschrieben:@Hyperion: Der OP schrieb etwas von "Termindatenbank", ich gehe also davon aus, dass er keine flatfiles benutzt.
Eine DB muss aber nicht relational sein! Ich persönlich würde sogar eine Flatfile-Lösung - je nach Strukturierung - als DB ansehen. Es ist ja auch müßig darüber zu streiten, da nur der OP uns mitteilen kann, wie es bei ihm aussieht.

Ich wollte ja auch Deinen Tipp nicht "niedermachen", sondern nur darauf hinweisen, dass Du eben zu viel voraussetzt. Daher ist es immer dann, wenn man ohne ausreichende Infos vom OP einen Tipp geben will, sinnvoll, etwas einschränkendes vor so ein Posting zu setzen, a la: "Solltest Du mit einer relationalen DB arbeiten, dann..." ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Deeet88
User
Beiträge: 9
Registriert: Donnerstag 23. Dezember 2010, 10:46

Web2py benutzt standardisiert dynamische db in
Ich habe in meinem model all meine Tabellen reingebaut.im controller sind alle dazugehörigen Funktionen implementiert.darunter auch,bei welchen seitenaufrufen eine authentifizierung nötig ist.

Benutzer anlegen und das einloggen geht auch wunderbar.nur sind die Daten nicht geschützt.

Soll ich mal meine controller Code Posten?bin nur gerade unterwegs,deswegen die sporadische Antwort^^
Deeet88
User
Beiträge: 9
Registriert: Donnerstag 23. Dezember 2010, 10:46

So, hier die 2 wichtigsten Codes:

Modell:

Code: Alles auswählen

if request.env.web2py_runtime_gae:       
    db = DAL('gae')                     
    session.connect(request, response, db = db)
    
else:                                         
    db = DAL('sqlite://storage.sqlite')
         
#CRUD importieren, Authentifizierung festlegen
from gluon.tools import *
auth = Auth(globals(), db)
auth.define_tables()
crud = Crud(globals(), db)

if auth.is_logged_in():
    user_id = auth.user.id
else:
    user_id = None
# CRUD und Log In Definition beendet

#### Definition der Datenbanken ####

#neuen Termin eintragen
db.define_table( 'termin',
    Field('titel', requires = IS_NOT_EMPTY(IS_NOT_IN_DB(db, 'termin.titel'))),
    Field('datum', 'date', requires = IS_NULL_OR(IS_DATE())),
    Field('zeit', 'time', requires = IS_NULL_OR(IS_TIME())),
    Field('erstellt', 'datetime', default=request.now),
    Field('autor', requires = db.auth_user, default=user_id),
    Field('beschreibung', 'text')
    )
# Termin eintragen ENDE

# Möglichkeit, einen Termin zu kommentieren
db.define_table('kommentieren',
    Field('termin_id', db.termin),
    Field('body', 'text'),
    Field('erstellt', 'datetime', default = request.now),
    Field('autor', db.auth_user, default = user_id))
# Termin kommentieren ENDE

# Dokumentdaten
db.define_table('dokument',
    Field('termin_id', db.termin),
    Field('name'),
    Field('datei', 'upload'),
    Field('erstellt', 'datetime', default = request.now),
    Field('autor', db.auth_user, default = user_id))
# Dolumentation ENDE

# Definitionen, welche Informationen angezeigt werden sollen, oder nicht
db.termin.beschreibung.requires= IS_NOT_EMPTY()
db.termin.erstellt.readable = False
db.termin.erstellt.writable = False
db.termin.autor.readable = False
db.termin.autor.writable = False

db.kommentieren.termin_id.requires = IS_IN_DB(db, 'termin.id', '%(titel)s')
db.kommentieren.body.requires = IS_NOT_EMPTY()
db.kommentieren.termin_id.readable = False
db.kommentieren.termin_id.writable = False
db.kommentieren.erstellt.readable = False
db.kommentieren.erstellt.writable = False
db.kommentieren.autor.readable = False
db.kommentieren.autor.writable = False
    
db.dokument.termin_id.requires = IS_IN_DB(db, 'termin.id', '%(titel)s')
db.dokument.name.requires = [IS_NOT_EMPTY(), IS_NOT_IN_DB(db, 'dokument.name')]
db.dokument.termin_id.readable = False
db.dokument.termin_id.writable = False
db.dokument.erstellt.readable = False
db.dokument.erstellt.writable = False
db.dokument.autor.readable = False
db.dokument.autor.writable = False

# ENDE Definitionen, welche Informationen angezeigt werden sollen, oder nicht

Und der Controller:

Code: Alles auswählen

import datetime

@auth.requires_login()
def index():
    """
    >>>index().has_key('termine')
    """
    ## Neuen Termin erstellen/eintragen
    form = crud.create(db.termin, next = URL(r = request, f = 'index'))
    return dict(form = form)
    
@auth.requires_login()
def list():
    ## Listet alle eingetragenen Termine auf
    termine = db().select(db.termin.id, db.termin.titel, db.termin.datum, orderby = db.termin.datum)
    return dict (termine = termine)
    
def show():
    ## Zeigt einen eingetragenen Termin und seine Details
    thistermin = db.termin[request.args(0)]
    if not thistermin:
        redirect (URL (r = request, f= 'index'))
    db.kommentieren.termin_id.default = thistermin.id
    if user_id:
        form = crud.create(db.kommentieren)
    else:
        form = None
    terminkommentare = db(db.kommentieren.termin_id == thistermin.id).select()
    return dict (termin = thistermin, kommentare = terminkommentare, form = form)
    
@auth.requires_login()
def edit():
    ## Termin verändern
    thistermin = db.termin[request.args(0)]
    if not thistermin:
        redirect (URL (r = request, f = 'index'))
    form = crud.update(db.termin, thistermin, next = URL(r = request, f= 'show', args = request.args))
    return dict (form = form)

@auth.requires_login()
def docs():
    ## Listet alle angehefteten Dokumente eines Termins auf
    thistermin = db.termin[request.args(0)]
    if not thistermin:
        redirect(URL (r = request, f = 'index'))
    db.dokument.termin_id.default = thistermin.id
    form = crud.create(db.dokument)
    termindokumente = db(db.dokument.termin_id == thistermin.id).select()
    return dict (termin = thistermin, dokumente = termindokumente, form = form)
    
def user():
    ## Benutzerauthentifizierung
    return dict(form=auth())


def download():
    ## Ermöglicht das Downloaden der terminbedingten Dateien
    return response.download(request,db)


def search():
    ## Datenbank nach bestimmten Terminen durchsuchen
    return dict (form = FORM (INPUT (_id = 'keyword', _name = 'keyword',
               _onkeyup = "ajax ('bg_find', ['keyword'], 'target');")), 
               target_div = DIV (_id = 'target'))
    
def bg_find():
    ## Listet die gefundenen Termine auf, mit Hilfe von XML
    pattern = '%' + request.vars.keyword.lower() + '%'
    termine = db(db.termin.titel.lower().like(pattern))\
        .select (orderby = db.termin.titel)
    items = [A(row.titel, _href=URL (r = request, f = show, args = row.id))
        \
        for row in termine]
    return UL (*items).xml()

def next():
    ## Es wird nur der Termin angezeigt, der noch kommt. Vergangene Termine werden ausgeschlossen
    alarm = db(db.termin.datum >= datetime.datetime.today()).select(db.termin.id, db.termin.titel, db.termin.datum, orderby = db.termin.datum)
    return dict (alarm = alarm)

Wie pack ich jetzt mein oben genanntes Problem am besten an?
Antworten