2016-09-28 5 views
-2

Wenn ich versuche, einen Benutzer zu registrieren, weiß ich nicht warum, aber wenn die E-Mail, die ich versuche zu registrieren, in der Datenbank nicht existiert, endet die for-Schleife obwohl es eine elif ende else Aussage gibt.Flask Registration Form Bedingung, wenn elif sonst nicht funktioniert

Jemand weiß warum? Diese

ist die web.py Datei

from flask import Flask, session, redirect, url_for, escape, request, render_template 
from wtforms import Form, BooleanField, TextField, PasswordField, validators 
import MySQLdb 
import logging 


app = Flask(__name__) 


db = MySQLdb.connect(host="127.0.0.1", user="root", passwd="usbw", port=3307, db="tourme") 
cur = db.cursor() 


@app.route('/register/', methods=["GET","POST"]) 
def register(): 

    email_msg = None 
    success_msg = None 
    pass_msg = None 
    test = None 

    try: 

     if request.method == 'POST': 

      id_id = None 
      username = request.form['name'] 
      lastname = request.form['lastname'] 
      email = request.form['email'] 
      password = request.form['password'] 
      repeat = request.form['repeat'] 

      cur = db.cursor() 
      cur.execute("SELECT * FROM users WHERE email = (%s)", [email]) 

      for row in cur.fetchall(): 
       if row[1] == email: 
        email_msg = "This e-mail already exist: " + row[1] 

       elif password == repeat: 
        cur.execute("INSERT INTO users VALUES (%s,%s,%s,%s,%s)", (id_id,email,username,lastname,password)) 
        db.commit() 
        success_msg = "Bravo" 
        db.close() 

       else: 
        pass_msg = "Password must match" 

     return render_template("register.html", email_msg=email_msg, success_msg=success_msg, pass_msg=pass_msg) 

    except Exception as e: 
     return(str(e)) 


app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT' 

if __name__ == '__main__': 
    app.run(debug=True) 

Und das ist die Vorlage

<div class="register">  
    <form action="" method="POST"> 
     <div class="input-group"> 
      <span class="input-group-addon" id="basic-addon3">Your Username</span> 
      <input type="text" class="form-control" name="name" aria-describedby="basic-addon3"> 
     </div> 
     <br> 
     <div class="input-group"> 
      <span class="input-group-addon" id="basic-addon3">Your Lastname</span> 
      <input type="text" class="form-control" name="lastname" aria-describedby="basic-addon3"> 
     </div> 
     <br> 
     <div class="input-group"> 
      <span class="input-group-addon" id="basic-addon3">Email</span> 
      <input type="email" class="form-control" name="email" aria-describedby="basic-addon3"> 
     </div> 
     <br> 
     <div class="input-group"> 
      <span class="input-group-addon" id="basic-addon3">Your Password</span> 
      <input type="password" class="form-control" name="password" aria-describedby="basic-addon3"> 
     </div> 
     <br> 
     <div class="input-group"> 
      <span class="input-group-addon" id="basic-addon3">Repeat Password</span> 
      <input type="password" class="form-control" name="repeat" aria-describedby="basic-addon3"> 
     </div> 
     <br> 
     <input type="Submit" value="Register" class="btn btn-default btn-sm"> 
    </form> 
    {% if success_msg %} 
     <p class=success_msg><strong>Message:</strong> {{ success_msg }} 
    {% endif %} 
    {% if email_msg %} 
     <p class=success_msg><strong>Error:</strong> {{ email_msg }} 
    {% endif %} 
    {% if pass_msg %} 
     <p class=pass_msg><strong>Error:</strong> {{ pass_msg }} 
    {% endif %}  
    <br> 
    <a href="{{ url_for('index') }}">Home</a> 
</div> 

Vielen Dank für Ihre Hilfe!

+0

Ich habe nicht Ihre Logik: erhalten alle Zeilen in der Datenbank, die die E-Mail-X, dann für jeden Zeile im Ergebnis, wenn die E-Mail nicht X ist, in die Datenbank einfügen. Warum hast du überhaupt eine Schleife? – polku

+0

für eine X-Mail in der DB suchen –

+0

Ja, ich könnte es ohne die Schleife tun, aber ohne die Schleife bekomme ich diese Fehlermeldung: "'NoneType' Objekt hat kein Attribut '__getitem__'" –

Antwort

2

Wie ich bereits im Kommentar gesagt habe, ist dies kaum ein Programmierproblem, es ist ein logisches Problem.

cur.execute("SELECT * FROM users WHERE email = (%s)", [email]) 

Das wird Ihnen alle Benutzer geben, die diese E-Mail bereits verwenden. So gibt es 2 Möglichkeiten:

  1. Es mindestens einen Benutzer ist (hoffentlich setzen Sie eine eindeutige Einschränkung auf E-Mail, so gibt es genau ein), dass diese E-Mail verwendet. Da das Abfrage-Set nicht leer ist, geben Sie die Schleife ein, natürlich geben Sie auch das if ein, da Sie die Zeile mit der E-Mail vergleichen, die Sie für die Anfrage verwendet haben, um die Zeile zu erhalten. Schließlich erhalten Sie das erwartete Verhalten.
  2. Kein Benutzer haben diese E-Mail. Nun, das Problem ist, dass das Abfrage-Set leer ist, so dass Sie nicht in die Schleife kommen und Sie nie Ihre INSERT INTO erreichen. Das ist das logische Problem: Ihr Einfügevorgang sollte nur ausgeführt werden, wenn der Suchanfragensatz leer ist. Wenn dies jedoch der Fall ist, kann Ihr Code den Einfügewert nicht erreichen.

Ich weiß nicht, wie man ohne Schleife versucht, aber diese sollten Werke:

cur.execute("SELECT * FROM users WHERE email = (%s)", [email]) 
if cur.fetchone(): 
    email_msg = '...' 
elif password == repeat: 
    cur.execute('...') 
else: 
    pass_msg = '...' 
+0

Ich bekomme die E-Mail-Nachricht, wenn Es gibt die E-Mail X in der DB, aber wenn es nicht ist, bekomme ich diesen Fehler: 'NoneType' Objekt hat kein Attribut '__getitem__' –

+0

Versuchen Sie, mehrmals zu holen? Fetchone verbraucht die Ergebnisse, was bedeutet, dass Sie es nur einmal tun können, danach wird None zurückgegeben. Wenn Sie das Ergebnis wiederverwenden wollen, müssen Sie es einer Variablen zuweisen: 'res = cur.fetchone() if res: print (res [1])'. – polku