Button, soll Python Funktion aufrufen

Django, Flask, Bottle, WSGI, CGI…
Antworten
BlackJack

@Susanne: Diese scheinbar einfache Frage ist IMHO nicht so einfach zu beantworten. Es gäbe da mehrere Möglichkeiten, je nach Rahmenbedingungen. Und als Kleinigkeit würde ich das nicht bezeichnen. Da steht immerhin ein Browser, HTML, möglicherweise JavaScript, HTTP, und ein Webrahmenwerk zwischen dem Klick und dem Funktionsaufruf.

Die erste Frage die sich stellt ist was möchtest Du *eigentlich* machen. Was ist das Ziel dieser Aktion — konkret und nicht so abstrakt mit Schaltfläche und Funktion. Ist das wirklich alles oder kommt da, möglicherweise später, noch mehr hinzu. Denn nur Schaltfläche und Funktion, dafür wäre mir persönlich Django zu überdimensioniert.

Grundvoraussetzung sind in jedem Fall neben Python noch HTML-Kenntnisse. Und ein wenig HTTP, also zumindest das man versteht was Browser und Webserver so an Daten austauschen bei GET- und POST-Anfragen und wo die in <form>s und im Webrahmenwerk wieder auftauchen.

Wenn Du Django verwenden möchtest, dann solltest Du das Tutorial in der Dokumentation mal durcharbeiten.

Grundsätzlich musst Du den Aufruf Deiner Funktion mit einer Anfrage vom Browser verbinden. Das einfachste wäre hier die Seite mit dem Button wieder auszuliefern. Dann brauchst Du entweder zwei fast indentische Seiten: Eine Einstiegsseite mit dem Button und einem Link zur zweiten URL welche die Funktion ausführt und die Seite mit dem Button und einem Link auf sich selbst ausliefert. Oder Du löst das mit einer Seite und einem Wert in der Anfrage der angibt, dass nicht nur der Button angezeigt werden soll, sondern auch die Funktion ausgeführt werden soll. Man kann hier mit <form> und <input> arbeiten. Im zweiten Fall dann neben dem <input> für die Schaltfläche noch mit einem „versteckten” <input>, das einen Aufruf der Funktion auslösen soll.

Statt mit <form> und <input> zu arbeiten könnte man hier übrigens auch einfache Links verwenden und die gegebenenfalls mit CSS als Schaltfläche gestalten. Wenn man schon CSS wie zum Beispiel Twitter's Bootstrap eingebunden hat, bietet sich so etwas an.

Falls die Anforderung ist, dass man die Funktion über die Schaltfläche auslösen kann, ohne dass die Webseite neu geladen wird, dann braucht man zwingend zwei URLs, also eine eigene für die Ausführung der Funktion. Und man braucht JavaScript und damit Kenntnisse in einer weiteren Programmiersprache und entweder Browsern direkt oder einer Bibliothek die Ajax-Anfragen über verschiedene Browser vereinheitlicht und vereinfacht. `jQuery` ist da eine beliebte Bibliothek die unter anderem etwas für Ajax bietet.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Um beim ursprünglichen Beispiel zu bleiben:

views.py:

Code: Alles auswählen

def wohnzimmer(request):
    if "schalter" in request.POST:
        name = request.POST.get("schalter")
        print name
        if name == "Wohnzimmer":
            Button = 'Sie haben den Schalter im Wohnzimmer gedrückt'
            return render(request,'articles.html', {'Button': Button,})
    return HttpResponseForbidden()

def index(request):
    return render(request,'index.html')
index.html:

Code: Alles auswählen

<html>
<body>
    <form method="post" action="{% url view_wohnzimmer %}"> {% csrf_token %}
      <input type="submit" name="schalter" value="Wohnzimmer" />
    </form>
</body>
</html>
und natürlich eine urls.py

Code: Alles auswählen

from django.conf.urls import patterns, url
urlpatterns = patterns('myproject.views',
    url(r'^', 'index'),
    url(r'^wohnzimmer.html', 'wohnzimmer', name="view_wohnzimmer"),
)
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@Susanne: Wie BlackJack gerade fast zeitgleich schrieb ist Webentwicklung eine durchaus komplexe Angelegenheit, bei der man in mehreren Disziplinen sattelfest sein muss.

Was Django betrifft, geht es im Prinzip so:
Du hast eine urls.py Datei in der die url-Patterns den View-Funktionen zugeordnet werden. Dort gibt es übrigens auch ein sehr praktisches name-Attribut.

In Templates kannst Du mit dem url-Template-Tag von Django die in der urls.py Datei definierten urls erzeugen lassen; dafür muss die entsprechende View aber auch in urls.py aufgeführt sein. Deine Fehlermeldung sagt aus, dass an dieser Stelle ein Problem auftritt.

Im Falle eines Formulars verwendest Du im form-Tag das url-Template-Tag als Parameter des action-Attributes. Dann wird durch Klick eines Buttons vom Type "Submit" die gewünschte Funktion aufgerufen.

Geh einfach mal in Ruhe das Tutorial durch, das ist für den ersten Einstieg ganz gut.
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

@Sussane: Sry, aber da fehlen Grundlagen. Mach doch bitte einmal das offizielle Django Tutorial, dann sollten solche Probleme nicht mehr auftreten.
Antworten