PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Cherrypy Frage...


Lord_X
2014-04-30, 09:57:50
Hallo zusammen :)

Ich bin nicht wirklich ein Programmierer aber kann mir jemand erklären, warum ich nur die Ausgabe von "def show_default" erhalte nicht aber die zweite von "show_host"? Wenn ich "@app.route('/')" zu "@app.route('/host')" ändere, kann ich die URL ändern und dann geht es aber ich hätte gerne die Ausgabe von beiden auf einer Seite. Hier der Code...


1 #!/usr/bin/env python2
2 # -*- coding: utf-8 -*-
3
4 import subprocess
5 from flask import Flask, request, render_template
6
7 app = Flask(__name__)
8
9 app.config.update(
10 DEBUG=True
11 )
12
13 @app.route('/')
14 def show_default():
15 _CMD = 'uname', '-o'
16 test = subprocess.check_output(_CMD)
17 return test
18
19 @app.route('/')
20 def show_host():
21 _CMD = 'uname', '-n'
22 name = subprocess.check_output(_CMD)
23 return name
24
25 app.run(host='0.0.0.0', port=8080)


Danke

universaL
2014-04-30, 10:45:19
Ohne Ahnung von Python und CherryPy zu haben, würde ich sagen:

1. Du kannst nur einen "Handler"/Methode pro Route haben, ob nun die zuerst, oder zuletzt definierte gewinnt, siehst du ja am Ergebnis ;-)
2. um beide auf einer Seite zu haben würde ich sowas in der Art machen, aber keine Ahnung ob String-Concatenation in Python so funktioniert, oder nicht ;-)


@app.route('/')
def show_default():
_CMD = 'uname', '-o'
test = subprocess.check_output(_CMD)
_CMD = 'uname', '-n'
name = subprocess.check_output(_CMD)
output = test + "\n" + name
return output

Dr.Doom
2014-04-30, 10:54:59
EDIT: Ok, ich hab' mal wieder falsch verstanden, was gewollt wurde.


Da ich nicht weiss, welches "app.route(..)" du geändert hast (oder evtl beide?), wäre mein Vorschlag:

13 @app.route('/') # <-- nur /
14 def show_default():
15 _CMD = 'uname', '-o'
16 test = subprocess.check_output(_CMD)
17 return test
18
19 @app.route('/host') # <-- /host
20 def show_host():
21 _CMD = 'uname', '-n'
22 name = subprocess.check_output(_CMD)
23 return name

Lord_X
2014-04-30, 11:11:25
1. Du kannst nur einen "Handler"/Methode pro Route haben
Ja das klappt bis auf das "newline".

Mhh dann muss ich anderst fragen: Wie kann ich die Ausgabe von mehreren Funktionen auf einer Seite ausgeben? Ich möchte diese ja auf der Seite nicht am gleichen Ort haben sondern verteilt über die Seite.

Grundsätzlich habe ich folgendes vor. Ich möchte Commands prüfen z.B. "apt-get" und diese dann auf einer Seite darstellen. Quasi in einer Art "Systemübersicht".


=======================================================================
= =
= Systeminfo: =
= =
= =
= apt-get: Updates vorhanden! =
= Hostname: XXXXXXX =
= load: 0.03, 0.07, 0.06 =
= users: 1 user =
= =
= =
= =
=======================================================================

Habe zuerst mit "python" und "cgi" gebastelt, was auch OK ist aber dann habe ich über "WSGI" gelesen und ich denke das ist die "bessere" Lösung.

Für Ideen bin ich offen :)

Nagelbrett
2014-04-30, 17:09:56
Du solltest einfach deine Funktionen, die die Daten zusammentragen, von den Route-Handler-Funktionen trennen. Außerdem solltest du dir mal das Templating (http://flask.pocoo.org/docs/templating/) von Flask anschauen, wenn du verschiedenes in einer Seite zusammenfassen möchtest. String-Konkatenation mit "+" ist in Python übrigens nicht besonders performant weil für jeden Zwischenschritt intern ein neuer String allokiert wird.

Lord_X
2014-05-01, 09:33:29
Du solltest einfach deine Funktionen, die die Daten zusammentragen, von den Route-Handler-Funktionen trennen.
Ja das muss ich noch anschauen. Das ist eine Idee. Die Übergabe von meiner Funktion in die Route-Handler-Funktion ist mir noch nicht ganz klar. Kann mir das jemand erklären?

Das mit den Templates habe ich auch angeschaut und im Moment sieht mein Ergebnis so aus (Anhang). Ist halt alles nicht so einfach, wenn man noch nie programmiert hat :)

Nagelbrett
2014-05-01, 22:19:55
Die Übergabe von meiner Funktion in die Route-Handler-Funktion ist mir noch nicht ganz klar. Kann mir das jemand erklären

Naja ganz einfach: du machst dir zwei Funktionen, die irgendwas spezifisches einsammeln und es als Ergebnis zurückgeben. Das kann in deinem Beispiel ja einfach die uname-Ausgabe als String sein.

def getOS():
return subprocess.check_output(('uname', '-o'))

def getNodename():
return subprocess.check_output(('uname', '-n'))
Zusätzlich machst du dann eine Route-Handler Funktion wie gehabt, in der du die zwei anderen Funktionen aufrufst und ihren Rückgabewert an dein Template übergibst:
@app.route('/')
def show_default():
return render_template('default.html', osname=getOS(), nodename=getNodename())
Im Template kannst du dann an beliebiger Stelle {{ osname }} und {{ nodename }} verwenden.

Lord_X
2014-05-02, 10:30:27
Vielen Dank das hilft mir weiter :)