Форма входа не работает вообще (с использованием flask) в CS50 Web Pset 1 - PullRequest
0 голосов
/ 01 апреля 2020

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

<form id="signupform" action="{{url_for  ('login') }}" method="post">
        <div class="input-group input-group-lg">
            <input type="text" class="form-control" placeholder="Username" aria-describedby="sizing-addon1" name="username" >
          </div>


        <div class="input-group input-group-lg">
            <input type="password" class="form-control" placeholder="Password (8 chars min)" aria-describedby="sizing-addon1" name="password" " >
          </div>


        <small id="emailHelp" class="form-text text-muted">
            We'll never share your info with anyone else.<br>
            <a href="signuppage">    No account? sign up here!</a>
        </small>

        <button type="button" class="btn btn-primary">Login</button>

    </form>

это форма ^^

import os

from flask import Flask, session ,render_template , request
from flask_session import Session
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker

app = Flask(__name__)

# Check for environment variable
if not os.getenv("DATABASE_URL"):
    raise RuntimeError("DATABASE_URL is not set")

# Configure session to use filesystem
app.config["SESSION_PERMANENT"] = False
app.config["SESSION_TYPE"] = "filesystem"
Session(app)

# Set up database
engine = create_engine(os.getenv("DATABASE_URL"))
db = scoped_session(sessionmaker(bind=engine))


@app.route("/")
def index():
    return render_template("login.html")


@app.route("/home" , methods=["POST"])
def login():

    # request username and password

    username=request.form.get("username")
    password=request.form.get("password")

    #check if account exists

    account= db.execute("SELECT * FROM users WHERE username = :username AND password = :password ",
    {"username":username , "password":password }).fetchone()

    if account is None:
        return render_template("loginerror.html")
    else:
        return render_template("homepage.html")

и это flask приложение ^^

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

i Я так потерян, любая помощь действительно ценится

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

Проблема здесь <button type="button" class="btn btn-primary">Login</button> . Из MDN элемента элемента do c:

type

Поведение кнопки по умолчанию. Возможные значения:

  • submit: Кнопка отправляет данные формы на сервер. Это значение по умолчанию, если атрибут не указан для кнопок, связанных с, или если атрибут является пустым или недействительным значением.
  • reset: Кнопка сбрасывает все элементы управления к их начальному значения, как. (Такое поведение раздражает пользователей.) Кнопка
  • : Кнопка не имеет поведения по умолчанию и ничего не делает при нажатии по умолчанию. Он может иметь клиентские сценарии для прослушивания событий элемента, которые запускаются при возникновении событий.
0 голосов
/ 01 апреля 2020

Вы не указали ошибку, которую получили (и должны это сделать), но я почти уверен, что форма, которую вы создали, правильная (в конце поля пароля есть заключительная кавычка)

В вашем @app.route("/home" , methods=["POST"]) фрагменте нет methods=["POST","GET"]). В настоящее время ваш код публикует его результат, но не может вернуть страницу назад. Когда вы используете почту, вы отправляете информацию на сервер, но это НЕ «запрос GET», который означает, что он не изменит ваш URL или не найдет новый. Вы должны реализовать функцию, которая проверяет, вошли ли вы в систему, и если да, то сделайте «window.location.href = myserver.com/home» (в js).

Также я предлагаю вам два вещи. Во-первых, используйте уже созданный механизм входа в систему, например flask-login, вы сэкономите время. Также, если вам не нужен доступ к модели одновременно с другими процессами, используйте библиотеку flask-sqlalchemy. Это хорошая оболочка, которая сокращает код, который вы должны написать

...