код страницы входа для python с использованием flask и psql кодов не работает - PullRequest
0 голосов
/ 19 июня 2020

Я пробую этот код для входа в учетную запись, которая имеет базу данных в psql, но по какой-то причине я могу отобразить только страницу с ошибкой, а не страницу успеха. psw - имя пользователя и пароль, взятые из формы.

Ответы [ 3 ]

0 голосов
/ 20 июня 2020
@app.route("/login", methods=['GET','POST'])
def login():
    return render_template("login.html")
    uname= request.form.get("uname")
    psw = request.form.get("psw")

    usernamedata= db.execute("SELECT username FROM register WHERE username=:username",{"username":username}).fetchone()
    passworddata= db.execute("SELECT password FROM register WHERE username=:username",{"username":username}).fetchone()
    if usernamedata is None:
        return render_template("error.html")
    else:
        return redirect(url_for('lsuccess'))
    @app.route("/lsuccess",methods=['GET','POST'])
    def lsuccess():
        return render_template("lsuccess.html")

вот как теперь выглядит мой код именно так, как вы сказали, но все же он отображает только страницу успеха. на этот раз

0 голосов
/ 21 июня 2020

Ваша форма отправляет запрос на lsuccess, который просто отображает успешную страницу без запроса сведений о пользователе.

Скопируйте запрос на другой маршрут (желательно только POST-запрос), всего у вас будет 3 маршрута.

  1. Маршрут входа, который отображает страницу входа.
  2. Проверить маршрут, на который форма отправляет данные, чтобы проверить пользователя и либо вернуть страницу с ошибкой, либо страницу успеха.
  3. Успешная страница, которая отображается, если пользователь проверен.

Окончательный код должен выглядеть следующим образом:

@app.route("/login", methods=['GET','POST'])
def login():
    return render_template("login.html") 

@app.route('/validate', methods=['POST'])
def validate():
    uname= request.form.get("uname")
    psw = request.form.get("psw")
    usernamedata= db.execute("SELECT username FROM register WHERE username=:username",{"username":username}).fetchone()
    passworddata= db.execute("SELECT password FROM register WHERE username=:username",{"username":username}).fetchone()
    if usernamedata is None:
        return render_template("error.html")
    else:
        return redirect(url_for('lsuccess'))

@app.route("/lsuccess", methods=['GET','POST'])
def lsuccess():
    return render_template("lsuccess.html")

Наконец, измените атрибут action вашей формы на action=/validate

0 голосов
/ 19 июня 2020
from flask import Flask, url_for, render_template, redirect
app = Flask(__name__)

@app.route('/')
def hello_world():
    ...
    ...
            #Don't know why you added an if Statement here
            if True:
                # 'lsuccess' is the name of your route function you are redirecting to
                return redirect(url_for('lsuccess'))

            #this statement is never reachable
            else:
                return render_template("error.html")

#You NEED A ROUTE FUNCTION named lsuccess, in this function, `render a template`
@app.route('/success')
def lsuccess():
    return render_template('your_success.html')

if True не повлияет на ваш код, так как условие всегда будет True, а блок else никогда не запустится.

Условие if usernamedata is None является достаточным условием чтобы убедиться, что пользователь существует.

В операторе else passworddata возвращает только одно значение, например, "password", использование for l oop будет перебирать каждый символ, например p, a и т. д. on.

Удалите for l oop, удалите if True, а затем удалите блок else.

Окончательный код должен выглядеть так:

from flask import Flask, url_for, render_template, redirect
app = Flask(__name__)

@app.route('/')
def hello_world():
    username = request.form.get("uname")
    password = request.form.get("psw")

    usernamedata = db.execute("SELECT username FROM register WHERE username=:username",
                              {"username": username}).fetchone()
    passworddata = db.execute("SELECT password FROM register WHERE username=:username",
                              {"username": username}).fetchone()
    if usernamedata is None:
        return render_template("error.html")
    else:
        return redirect(url_for('lsuccess'))

@app.route('/success')
def lsuccess():
    return render_template('your_success.html')
...