2 Buttons, 2 Funktionen

Django, Flask, Bottle, WSGI, CGI…
Antworten
erdmulch
User
Beiträge: 230
Registriert: Samstag 17. Juli 2010, 19:50

Hallo zusammen,

ich habe folgendes Problem:
Ich will eine kleine Paketverwaltung machen. d.h es werden alle verfügbare Pakete in einer Dropdown liste aufgelistet, was auch funktioniert.
Nun würde ich gerne Paket A in der Dropdown Liste auswählen und mit dem Button "installieren" das entsprechende Paket installieren.
Wenn ich dann Paket A installiert habe, würde ich es gerne wieder deinstallieren mit dem Button "deinstallieren"

allerdings wird das Paket immer installiert, weil im htmal code "file_install" übertragen wird.
Nun ist meine frage, wie ich dies differenzieren kann, kann ich da eventuell nochmals einen wert übergeben?
Leider habe ich das nicht geschafft

vielen Dank im voraus

Code: Alles auswählen

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
       "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Package_management</title>
</head>
<body>
{% include "base.html" %}
<form action="" method="post">
<select name ="file_install" size = "10">
    {%for file in files%}
      <option>{{file}}</option>
    {%endfor%}
  </select>
<input type="submit" value="installieren" ></input>
<input type="submit" value="deinstallieren" ></input>

</body>
</html>
und hier ist mein Python code:

Code: Alles auswählen

# Create your views here.
from django.template import Context, loader
from django.http import HttpResponse
from django.shortcuts import render
import os



def v_Package_management(request):
    files = os.listdir("/home/Peter/static/Pakete/")
    newlist = []
    for names in files:
        if names.endswith(".deb"):
            newlist.append(names)
    files = newlist
    if request.method == 'POST':
        if 'file_install' in request.POST:
            print "install"
            os.system('sudo dpkg --install /home/Peter/static/Pakete/'+ request.POST.get('file_install') )
        if 'file_deinstall' in request.POST:
            print "deinstall"
    render_dict={'files':files,
                }
    return render(request,'Package_management/index.html', render_dict)
BlackJack

@erdmulch: Du testest da da auch auf das falsche, Du testest ob der ausgewählte Paketname in den POST-Daten ist, Dich interessiert doch an der Stelle aber welchen Wert 'submit' hat.

Edit: Und bitte! Das ist eine *Riesensicherheitslücke*! Man kann Dir da nahezu beliebigen Shell-Code unterschieden der dann auch noch mit Root-Rechten ausgeführt wird. Noch vollständiger kann man sich ja gar nicht in den Fuss schiessen…
Sirius3
User
Beiträge: 18255
Registriert: Sonntag 21. Oktober 2012, 17:20

@erdmulch: Du mußt den Buttons einen Namen geben, dann werden deren Wert auch mitgeschickt. Daran kannst Du "installieren" und "deinstallieren" unterscheiden.
erdmulch
User
Beiträge: 230
Registriert: Samstag 17. Juli 2010, 19:50

das habe ich auch schon gemacht.
hier der html code dazu:

Code: Alles auswählen

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
       "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Package_management</title>
</head>
<body>
{% include "base.html" %}
<form action="" method="post">
<select size = "10">
    {%for file in files%}
      <option>{{file}}</option>
    {%endfor%}
  </select>
<input type="submit" value="installieren" name ="file_install"></input>
<input type="submit" value="deinstallieren" name ="file_deinstall"></input>

</body>
</html>
Dann kommt folgende Meldung:
[15/Jan/2015 21:09:11] "GET /Package_management/ HTTP/1.1" 200 3012
install
dpkg: error processing /home/Peter/static/Pakete/installieren (--install):
cannot access archive: No such file or directory
Errors were encountered while processing:
/home/Peter/static/Pakete/installieren

was auch logisch ist. Jetzt nimmt er den Wert "installieren" und setzt diesen ans ende von meinem Pfad
Sirius3
User
Beiträge: 18255
Registriert: Sonntag 21. Oktober 2012, 17:20

@erdmulch: jetzt hat ja Dein <select> keinen Namen mehr!
erdmulch
User
Beiträge: 230
Registriert: Samstag 17. Juli 2010, 19:50

ja genau, aber ich weiß nicht wie ich das lösen soll
da ich ja eine Fallunterscheidung im Python code brauche, deshalb muss es einmal file_install und einmal file_deinstall heißen, da ich ja nur eine Dropbox habe
Sirius3
User
Beiträge: 18255
Registriert: Sonntag 21. Oktober 2012, 17:20

Mal als Wink mit dem Baumstamm:

Code: Alles auswählen

<form action="" method="post">
<select name="selected_file" size="10">
    {%for file in files%}
      <option>{{file}}</option>
    {%endfor%}
  </select>
<input type="submit" value="installieren" name="action"></input>
<input type="submit" value="deinstallieren" name="action"></input>
</form>
erdmulch
User
Beiträge: 230
Registriert: Samstag 17. Juli 2010, 19:50

funktioniert leider immer noch nicht.
jetzt muss ich bestimmt meine Python funktion anpassen oder nicht?
BlackJack

Mal was anderes: ``{% include "base.html" %}``? Das sollte doch eigentlich ``extends`` heissen und es fehlt mindestens ein ``block``-Tag in dem Beispiel, oder?

Edit: Ja jetzt musst Du den Code anpassen. Da sind *zwei* Namen in dem Form. Du musst jetzt mit beiden etwas anderes und am besten das richtige machen.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

BlackJack hat geschrieben:Mal was anderes: ``{% include "base.html" %}``? Das sollte doch eigentlich ``extends`` heissen und es fehlt mindestens ein ``block``-Tag in dem Beispiel, oder?
include gibt es auch.
BlackJack

@/me: Ich weiss aber nicht wenn danach "base.html" steht. Dann ist das entweder ein Vertipper oder jemand hat das Templatesystem nicht verstanden und macht Murks. Oder der Dateiname ist gedankenlos gewählt weil das in irgendwelchen Tutorials (im Zusammenhang mit *extend*!) immer so hiess. Es riecht auf jedenfall sehr komisch an der Stelle.
erdmulch
User
Beiträge: 230
Registriert: Samstag 17. Juli 2010, 19:50

ich check nicht wie ich das dictionary im Python code auslesen soll
tut mir echt leid. Ich geh jetzt ins Bett
Sirius3
User
Beiträge: 18255
Registriert: Sonntag 21. Oktober 2012, 17:20

@erdmulch: weil heut Freitag ist, und um die Welt ein bißchen sicherer zu machen:

Code: Alles auswählen

PAKET_PATH = "/home/Peter/static/Pakete/"

def v_Package_management(request):
    files = [name for name in os.listdir(PAKET_PATH) if name.endswith(".deb")]
    if request.method == 'POST':
        action = request.POST.get('action')
        paket = request.POST.get('selected_file')
        if paket not in files:
            raise AssertionError("Paket nicht gefunden!")
        if action == 'installieren':
            subprocess.call(['sudo', 'dpkg', '--install', os.path.join(PAKET_PATH, paket)])
        elif action == 'deinstallieren':
            print "deinstall"
    render_dict = {'files':files}
    return render(request,'Package_management/index.html', render_dict)
Antworten