django-service-objects mit Parametern

Django, Flask, Bottle, WSGI, CGI…
Antworten
efix
User
Beiträge: 43
Registriert: Samstag 7. Dezember 2019, 20:59

Hallo,

ich komm gerade nicht weiter und ich finde nichts darüber. Ich würde gerne django-service-objects
benutzen... oder besser gesagt ich bin schon dabei. Aber ich weiss nicht wie ich den service Parameter übergebe...

view.py

Code: Alles auswählen

@csrf_exempt
def start(request, **user_id):
    if user_id:
        uid = user_id
    else:
        uid = {"user_id": "test"}

	"""ich weiss nicht ob das so richtig ist und wenn ja wie ich im service auf uid zugreife """
    context = GetBookingService.execute({'uid': uid['user_id']})
    
    if request.method == 'POST':
        data = dict(request.POST)
        #b.insert_booking(uid['user_id'], data)
        return redirect('/start/' + uid['user_id'])
    ctj = {'data': json.dumps(context)}
    return render(request, "index.html", ctj)
service Datei

Code: Alles auswählen

class GetBookingService(Service):
    uid = ''
    def process(self):
        #self.uid = Service.
        return self.get_from_user(self.uid)
    # data = db.selectTest()
    # for row in data.iterator():
    # print(row.user)
Vielen Dank schonmal für jede Hilfe
efix
User
Beiträge: 43
Registriert: Samstag 7. Dezember 2019, 20:59

Ich habe das jetzt so gemacht. Aber jetzt habe ich das Problem dass die execute funktion einen input erwartet..

ist es nicht das Selbe wenn ich einfach process aufrufe?
Ich habe leider darüber nichts finden können. Ich habe nur etwas gefunden das die execute funktion sicherstellen soll das process aufgerufen wird und ggf. Fehler ausgeben soll...

Code: Alles auswählen

class GetBookingService(Service):
    uid = ''
    def process(self):
        return self.get_from_user()
...

Code: Alles auswählen

def start(request, **user_id):
    if user_id:
        uid = user_id
    else:
        uid = {"user_id": "test"}
    getbooking = GetBookingService()
    getbooking.uid = uid['user_id']
    context = getbooking.process()
 ...
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@efix: Wenn das ein Problem ist das `execute()` ein Argument erwartet und wenn Du auf dem abgeleiteten `Service`-Objekt gar keine Django-Forms Attribute definierst, dann stellt sich die Frage warum Du überhaupt ein `Service`-Objekt verwenden willst, von dem Du am Ende nichts verwendest. Das macht keinen Sinn.

Es ist natürlich nicht das selbe statt `execute()` direkt `process()` aufzurufen. `execute()` macht mehr als nur das. Und da auch wieder: wenn Du nicht weisst was das macht, und es deswegen einfach nicht benutzt, also letztlich *gar nichts* von `Service` oder `Form` benutzt, dann ist das hochgradig sinnbefreit überhaupt `Service` zu verwenden.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
efix
User
Beiträge: 43
Registriert: Samstag 7. Dezember 2019, 20:59

Was sind denn Form-Attribute?
efix
User
Beiträge: 43
Registriert: Samstag 7. Dezember 2019, 20:59

so?

Code: Alles auswählen

def start(request, **user_id):
    if user_id:
        uid = user_id
    else:
        uid = {"user_id": "test"}
    context = GetBookingService.execute({'uid': uid['user_id']})

Code: Alles auswählen

class GetBookingService(Service):
    uid = forms.CharField()
    def process(self):
        return self.get_from_user()
efix
User
Beiträge: 43
Registriert: Samstag 7. Dezember 2019, 20:59

Aber dann bekomme ich einen Fehler:

AttributeError: 'GetBookingService' object has no attribute 'uid'
efix
User
Beiträge: 43
Registriert: Samstag 7. Dezember 2019, 20:59

ok so gehts.

Ist das denn so richtig?

Code: Alles auswählen

class GetBookingService(Service):
    uid = forms.CharField()
    def process(self):
        self.uid = self.cleaned_data['uid']
        return self.get_from_user()

Code: Alles auswählen

def start(request, **user_id):
    if user_id:
        uid = user_id
    else:
        uid = {"user_id": "test"}
    context = GetBookingService.execute({'uid': uid['user_id']})
Ruft man denn so einen Service auf oder muss ich ein Objekt erstellen?
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@efix: Man sollte ausserhalb der `__init__()` keine Attribute einführen. Wenn `get_from_user()` die UID braucht, muss die halt als Argument übergeben werden oder vielleicht besser gar keine zusätzliche Methode sein, sondern einfach der Inhalt der `process()`-Methode. Ein `Service`-Objekt ist ein kompliziert geschriebene Funktion deren Funktionskörper in `process()` gehört, wobei die Argumente aus `self.cleaned_data` kommen, die mit `execute()` aufgerufen wird, mit *einem* Argument, einem Wörterbuch, wo die Argumente drin stehen, die gegen die definierten Form-Felder validiert werden. Also letztlich nur ein superhässlicher Weg ein Funktionsargument das ein Wörterbuch sein muss, gegen Form-Felder zu validieren. Und es geht wirklich um die Validierung des einzigen Arguments in Wörterbuch-Form, denn die Begründung in der Dokumentation Logik von Views und Models zu trennen würde eine einfache normale Funktion ohne diesen `Service`/`Form`-Objekt-Quatsch genau so gut erfüllen.

Code: Alles auswählen

def start(request, user_id="test"):
    context = get_from_user(user_id)
    ...
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten