Ich verbringe mittlerweile einen Grossteil meines Tages damit einen Fehler zu verstehen, ich werd aber irgendwie nicht schlauer, deswegen wollte ich hier mal Fragen. Eins vorweg: Ich bin mir selber nicht ganz sicher wie der Fehler auftritt oder warum, deswegen bitte Nachsicht, wenn es etwas konfus klingt.
Ich habe eine Funktion rev die entweder einen String oder eine Funktion zurueckgeben soll, je nachdem welche Parameter gesetzt sind (Ist zum aufloesen von URLs. Sind dynamische Parameter vorhanden, so muss erst ein weiteres Objekt/Dict geliefert werden)
Code: Alles auswählen
def rev(url=None, stat=dict(), dyn=dict(), obj=None):
if obj == None and len(dyn) > 0:
def tmp(obj):
return rev(url, stat, dyn, obj)
return tmp
else:
# Static-array in dict umwandeln
if isinstance(dyn, list):
dynamic = dict([(x,x) for x in dyn])
else:
dynamic = dyn
# dyn aufloesen und mit static mergen
for field_name, param_name in dynamic.items():
stat[param_name] = get_field_value(obj, field_name)
# URL aufloesen
return reverse(url, kwargs=stat)
WEnn ich diesen Webserver jetzt frisch starte und die Startseite aufrufe, dann werden unter anderem ein paar Klassendefinitionen gelesen und in diesem Rahmen ein rev('edit', dyn=['id']) aufgerufen, es wird also eine Funktion (1) zurueckgegeben. Danach wird rev('create') aufgerufen und es wird korrekte url zurueckgegeben. Anschliessend wird durch eine Ajax-Funktion beim Server ein Ladevorgang ausgeloest, der unter anderem die Funktion (1) mit einem Objekt gefuettert (also die Anonyme Funktion tmp aufgerufen).
Soweit auch alles gut. Lade ich die Startseite jetzt jedoch neu, dann wird wieder rev('create') aufgerufen und jetzt passiert das, was ich mir nicht erklaeren kann. Innerhalb von rev('create') hat stat schon zu funktionsbeginn den Wert {'id':Blub}, also das, was in (1) dynamisch zu dem stat-dict hinzugefuegt wurde.
Also vielleicht nochmal in kurz:
Code: Alles auswählen
rev('edit', dyn=['id'])
# wird beim Import des Moduls aufgerufen
# zurueck kommt eine Referenz auf tmp
rev('create')
# wird beim aufrufen der Startseite geladen
# dyn, stat und obj sind alle leer, es wird der korrekte String geliefert
tmp(dict(...)) -> rev('edit', dyn=['id'], dict(...)
# gelieferte Funktion aus Schritt eins wird aufgerufen und ruft rev mit den Parametern auf.
# in Rev wird z.B. stat['id'] = 4 hinzugefuegt
rev('create')
# Seite wird neu geladen, rev wieder aufgerufen.
# SChon beim FUnktionseintritt hat stat jetzt den Inhalt {'id':4}
Vielleicht habe ich heute einfach schon zu lange da draufgeguckt, aber ich werd nicht draus schlau. Deswegen hoffe ich jetzt, dass einer von euch damit was anfangen kann und ich nur wieder zu dumm war und was uebersehen hab. Vielen lieben Dank schonmal jetzt