Seite 1 von 1

2 Buttons, 2 Funktionen

Verfasst: Donnerstag 15. Januar 2015, 20:48
von erdmulch
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)

Re: 2 Buttons, 2 Funktionen

Verfasst: Donnerstag 15. Januar 2015, 20:57
von 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…

Re: 2 Buttons, 2 Funktionen

Verfasst: Donnerstag 15. Januar 2015, 21:05
von Sirius3
@erdmulch: Du mußt den Buttons einen Namen geben, dann werden deren Wert auch mitgeschickt. Daran kannst Du "installieren" und "deinstallieren" unterscheiden.

Re: 2 Buttons, 2 Funktionen

Verfasst: Donnerstag 15. Januar 2015, 21:13
von erdmulch
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

Re: 2 Buttons, 2 Funktionen

Verfasst: Donnerstag 15. Januar 2015, 21:21
von Sirius3
@erdmulch: jetzt hat ja Dein <select> keinen Namen mehr!

Re: 2 Buttons, 2 Funktionen

Verfasst: Donnerstag 15. Januar 2015, 21:30
von erdmulch
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

Re: 2 Buttons, 2 Funktionen

Verfasst: Donnerstag 15. Januar 2015, 21:44
von Sirius3
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>

Re: 2 Buttons, 2 Funktionen

Verfasst: Donnerstag 15. Januar 2015, 22:03
von erdmulch
funktioniert leider immer noch nicht.
jetzt muss ich bestimmt meine Python funktion anpassen oder nicht?

Re: 2 Buttons, 2 Funktionen

Verfasst: Donnerstag 15. Januar 2015, 22:06
von 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.

Re: 2 Buttons, 2 Funktionen

Verfasst: Donnerstag 15. Januar 2015, 22:32
von /me
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.

Re: 2 Buttons, 2 Funktionen

Verfasst: Donnerstag 15. Januar 2015, 22:40
von 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.

Re: 2 Buttons, 2 Funktionen

Verfasst: Donnerstag 15. Januar 2015, 23:02
von erdmulch
ich check nicht wie ich das dictionary im Python code auslesen soll
tut mir echt leid. Ich geh jetzt ins Bett

Re: 2 Buttons, 2 Funktionen

Verfasst: Freitag 16. Januar 2015, 07:47
von Sirius3
@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)