Bottlepy homepage online stellen

Django, Flask, Bottle, WSGI, CGI…
DanJJo
User
Beiträge: 90
Registriert: Mittwoch 13. Februar 2013, 18:35

Wie stoppe ich den prozess denn?
BlackJack

@DanJJo: Prozess-ID mit `ps` herausfinden und mit `kill` dann beenden.
DanJJo
User
Beiträge: 90
Registriert: Mittwoch 13. Februar 2013, 18:35

Hey super es läuft danke!!!

Nun hab ich aber noch ein problem :mrgreen:

es gibt in meiner Main.py routen wie diese

Code: Alles auswählen

@route('/login_submit', method='POST')
@route('/login_submit/', method='POST')
def login_submit(db):
    name = request.forms.get('username').decode('utf-8')
    password = request.forms.get('password').decode('utf-8')
    sql = db.execute('SELECT Password FROM **** where Name=?',(name,))
    row = sql.fetchone()
    if row:
      pwhash = row[0]
      if check_hash(password,pwhash):
	response.set_cookie("account", name, secret='*****', max_age=100000)
	return template("hauptmenu")
      else:
        return template("login") 
    else:
      return template("universal") 
zu dennen es keine *.tpl gibt.

Nun gehe ich über login (dazu gibts eine *.tpl) und möchte mich einloggen. Wenn ich auf submit klicke (lokal werde ich an das template Hauptmenu geschickt) nicht lokal bekomme ich in der Webkonsole die meldung 404 not found. Im Login *.tpl ist folgendes javascript für "dynamischen content load" eingetragen

Code: Alles auswählen

<script>     
(function() {
$('.logi').bind("submit", function() {
 
        /* ajax objekt zum aufruf & versand an das skript
        'name' und 'email' sind in der data-zeile die variablen für das php-skript */
        $.ajax({
            type: "POST",
            url: "/login_submit",
            data: "username=" + $("#username").val() + "&password=" + $("#password").val(), 
            success: function(msg)
            {
                /* form-div verstecken, seite nachladen & wieder einblenden (2000 ms) */
                $("#content").hide().load("/hauptmenu").fadeIn(2000);
            }
        });
        return false;
      });
      
      })();
</script>
wieso geht das lokal aber im "Internet" sagt er, dass die URL nicht existiert (sie existiert ja auch nicht ^^)
BlackJack

@DanJJo: Ich verstehe die Frage nicht so ganz. Du weisst das die URL nicht existiert, aber Du fragst Dich warum die zu einem 404 führt? Wenn das bei Dir lokal funktioniert, dann existiert sie dort auch.

Du darfst solche URLs im Template halt nicht absolut angeben, sondern musst die URL bis zur Anwendung davor setzen und dann den Rest relativ dazu angeben. Also wenn das `request`-Objekt unter dem Namen im Template verfügbar ist (ungetestet):

Code: Alles auswählen

            url: "{{request.script_name}}/login_submit",
DanJJo
User
Beiträge: 90
Registriert: Mittwoch 13. Februar 2013, 18:35

Also es gibt faktisch kein login_submit template. In meiner Main.py ist login_submit eine route zu einer Funktion, welche in der Datenbank die Daten in der Datenbank abfragt...und ein template zurück gibt. Lokal funktioniert es auch so ohne probleme...global findet er die URL (also template als Route schon) nicht, da es sie natürlich auch nicht gibt.
BlackJack

@DanJJo: Ich glaube Du bringst hier Begrifflichkeiten durcheinander. Templates haben nichts mit Routen oder URLs zu tun. Und eine URL muss halt existieren, also es muss eine Route dafür existieren. Sonst gibt es logischerweise einen 404-Fehler.
DanJJo
User
Beiträge: 90
Registriert: Mittwoch 13. Februar 2013, 18:35

Also ich bekomme das mit dem Pfad nicht hin.

Ich hab momentan (wahrscheinlich ist das nicht ganz richtig) alles im fcgi-bin verzeichniss main.py alle *.tpl etc. in dem login *.tpl ist mein script, welches über /login_submit die funktion log_submit in der Main.py aufrufen soll. Lokal geschieht dies auch wunderbar...im "internet" nicht und ich weiß echt nicht wie der Pfad relativ dazu aussehen soll, da alle dateien im selben Ordner liegen und die login_submit geschichte sowieso eine funktion der Main.py ist.
BlackJack

DanJJo: Schau Dir doch mal die URL in Deinem Browser an. Die wird doch ungefähr so aussehen: ``http://account_name.carina.uberspace.de/fcgi-bin/Main.py/irgendwas``. Und Du versuchst jetzt eine URL ``/login_submit`` abzufragen. Das ist dann also der Domain-Teil plus dieser URL, also ``http://account_name.carina.uberspace.de/login_submit``. Und diese URL gibt es nicht, deswegen 404.

Du brauchst vor dem ``/login_submit`` noch den Teil vom Skript. Und den schreib jetzt *bitte* nicht hart in das Template, denn das ist ganz furchtbar unflexibel, sondern benutze ``request.script_name`` dafür. Denn Bottle selbst weiss ja wie die URL bis zu dem Teil aussieht, der dann innerhalb der Anwendung über Routen angesprochen wird. Wenn man das verwendet, statt die URLs hart in die Templates zu schreiben, kann man die URL bis zum Skript beliebig verändern ohne etwas am Quelltext oder Template verändern zu müssen.
DanJJo
User
Beiträge: 90
Registriert: Mittwoch 13. Februar 2013, 18:35

Code: Alles auswählen

url: "{{request.script_name}}/login_submit",
funktioniert leider nicht...wäre aber elegant!

hab nun so gemacht... in der *.py

Code: Alles auswählen

def requestName():
	return request.script_name
und dann einfach mit übergeben und per

Code: Alles auswählen

url:"{{script}}/login_submit"

läufts jetzt auch...

nun hab ich aber gemerkt, dass so einiges irgendwie nicht stimmt was local funktioniert hat...z.B setze ich für ein Login einen Cookie mit

Code: Alles auswählen

response.set_cookie("account", name, secret='BlaBla', max_age=1000)


dann steht in einer router so etwas...

Code: Alles auswählen

@route("/hauptmenu")
@route("/hauptmenu/")
def hauptmenu (db):
  	logged = request.get_cookie("account", secret='BlaBla')
	if logged:
	  return template("hauptmenu")
	else:
	  return template("login",script=requestName())
so eigentlich ist der cookie gesetzt und er müsste mir das hauptmenu.tpl zurck geben....tut er aber nicht... setze ich meinen Cookie Falsch?
BlackJack

@DanJJo: Natürlich funktioniert das so wie ich das gemacht habe wenn `request` unter dem Namen an das Template übergeben wird. Du machst es doch genau so, nur mit mehr Zwischenschritten und einer unnötigen Funktion.
DanJJo
User
Beiträge: 90
Registriert: Mittwoch 13. Februar 2013, 18:35

:K mir gibt er aber an, dass er "request" nicht kennt.
BlackJack

@DanJJo: Dann hast Du es vielleicht falsch geschrieben‽
DanJJo
User
Beiträge: 90
Registriert: Mittwoch 13. Februar 2013, 18:35

:roll: ich habs aus dem Forum kopiert ausprobiert...nochmal geschrieben ausprobiert, umgeschrieben ausprobiert...jedesmal bad request 500. :? aber meine Methode klappt ja auch...vllt bin ich einfach zu dumm für die schnelle variante aber ich lern ja nicht aus....kannst du mir vllt zu meinem Cookie problem helfen? ist das so richtig wie ich das mach? wenn ja warum liest er den cookie nicht ?
DanJJo
User
Beiträge: 90
Registriert: Mittwoch 13. Februar 2013, 18:35

nochmal zu dem Cookie problem...kann es sein, dass es ein Path problem ist? hab grad gelesen, dass es ind bottle sowas wie path="" für cookies gibt welche den wert default = "/" haben...das würde evtl bedeutet, dass ich für jede seite neue cookierechte vergeben muss? lokal funktioniert es ja weil alles ja in "/" liegt....


also: es lag doch am path...so läufts dann auch...

Code: Alles auswählen

response.set_cookie("account", name, secret='BlaBla',path='/')
allerdings hab ich probleme mit meiner delete_cookie funktion. Sie löscht den Cookie nicht :K

Code: Alles auswählen

response.delete_cookie('BlaBla', path='/')


oder was ist im doc mit "key" gemeint?
Antworten