Вернуть результат запроса postgresql на html-страницу

Я создаю сайт обзора книги для CS50. У меня проблема с отображением запроса. Проблема находится в каталоге / books. В файле books.html есть форма с тремя входами: isbn, заголовок, автор и кнопка отправки. Как только я нажимаю кнопку отправки, он перенаправляется на страницу входа. Моя цель - вывести его пользователю. Если бы кто-нибудь мог мне помочь, это было бы действительно полезно. Я получаю сообщение об ошибке:

TypeError: объект ImmutableMultiDict не вызывается

 import os

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

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.secret_key = 'key'
app.config["SESSION_PERMANENT"] = False
app.config["SESSION_TYPE"] = "filesystem"


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

@app.route("/")
def index():

    return render_template('index.html', navbar=True)

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

    if request.method == 'POST':

        username = request.form.get('username')
        password = request.form.get('password')
        cpassword = request.form.get('cpassword')

        if not password == cpassword:
            return render_template('error.html', message='Passwords do not match')

        avail = db.execute('SELECT username FROM userdetails WHERE username=:username',
                                {'username': username}).fetchone()

        if avail:
            return render_template('error.html', message='Username Already Exists')

        db.execute('INSERT INTO userdetails(username, password) VALUES(:username, :password)',
         {'username': username, 'password': password})
        db.commit()

        session["username"] = username

        return redirect('/')

    else:
        return render_template('register.html')

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

    if request.method == 'POST':

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

        user = db.execute('SELECT * FROM userdetails WHERE (username=:username AND password=:password)',
                             {'username': username, 'password': password}).fetchone()

        if user is None:
            return render_template('error.html', message='Entered credentials not valid!')

        session["username"] = username

        return redirect('books')

    else:
        return render_template('login.html', navbar=False)



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

    isbn = request.form.get('isbn')
    title = request.form.get('title')
    author = request.form.get('author')

    result = db.execute('SELECT * FROM books WHERE (isbn=:isbn AND title=:title AND author=:author)',
                             {'isbn': isbn, 'title': title, 'author': author}).fetchall()


    return render_template('books.html')

@app.route("/result", methods=['GET', 'POST'])
def results():
    if request.method == 'POST':
      result = request.form()
      return render_template("result.html",result = result)

Books.html

<html>
<head>
<title>Books</title>
</head>
<form method = "POST" action = "/result">
  <input type = "number" name = "isbn" placeholder = "isbn">
  <input type = "text" name = "title" placeholder = "title">
  <input type = "text" name = "author" placeholder = "author">
  <input type = "submit" value = "Submit">
</form>
</html>

Result.html

<html>
<head>
</head>
<body>
  {{result}}
</body>
</html>

Я не совсем уверен, как бы вы потребляли данные, но с конца api вам нужно сделать его сериализуемым в форме объекта json или списка json, который может быть прочитан вашим представлением. Создайте служебную функцию mapper для сопоставления объекта с dict, который можно преобразовать в json. и, пожалуйста, измените заголовок, который вы не хотите, на "распечатать запрос postgres", вы хотите вернуть результаты запроса

mad_ 24.12.2018 17:07

Вау, братан, ты можешь объяснить это попроще? Я изменил название по вашему запросу.

Salman Shanavas 24.12.2018 20:14
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
705
1

Ответы 1

Одна из проблем - это <form method = "POST" action = "/login"> в book.html. Он отправляет пользователя обратно на страницу входа. Из спецификации, похоже, маршрут books взят со страницы search (с еще не реализованными "обзорами"). Страница «книги» должна позволять пользователю вводить оценку и обзор, а при отправке предположительно обновлять таблицу «обзоров» в базе данных (как было предложено в первой подсказке). Похоже, страница книги не завершена.

Эта строка result = request.form() в результатах может быть дает TypeError, поскольку form является MultiDict согласно фляжка док. Добавление () в конец выглядит как вызываемая функция.

form

A MultiDict with the parsed form data from POST or PUT requests. Please keep in mind that file uploads will not end up here, but instead in the files attribute.


В сообщении об ошибке TypeError: 'ImmutableMultiDict' object is not callable должен быть указан номер строки. Вероятно, связано с вызовом login без аргументов формы запроса username и passsword.

Извини за это. Я уже исправил это. Если бы вы могли помочь сейчас, это было бы действительно полезно.

Salman Shanavas 24.12.2018 20:13

Убедитесь, что текущий код размещен под вопросом. И TypeError должен выдавать точную строку, добавьте это к вопросу. Ответ отредактирован.

DinoCoderSaurus 24.12.2018 20:26

Это дает ошибку строки в строке: result = request.form ()

Salman Shanavas 25.12.2018 08:23

Это дает ошибку строки в строке: result = request.form (). Итак, мой план таков: после страницы входа пользователь получит страницу поиска, где он сможет ввести сведения о книге, затем он будет перенаправлен на страницу с именем books.html, где он сможет выбрать, какую книгу он хочет использовать, и после нажатия на него можно перейти на book.html, где он может отправить отзывы и прочитать описание.

Salman Shanavas 25.12.2018 08:30

Другие вопросы по теме