【问题标题】:Return result of postgresql query onto a html page将 postgresql 查询的结果返回到 html 页面
【发布时间】:2018-12-24 15:25:16
【问题描述】:

我正在为 CS50 创建一个书评网站。我在显示查询时遇到问题。问题出在 /books 目录中。 books.html 包含一个带有 3 个输入的表单:isbn、title、author 和一个提交按钮。一旦我单击提交按钮,它就会重定向到登录页面。我的目标是将其输出给用户。如果有人可以帮助我,那将非常有帮助。我收到错误:

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)

书籍.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>

结果.html

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

【问题讨论】:

  • 我不完全确定您将如何使用数据,但从 api 端开始,您需要使其以 json 对象或 json 列表的形式可序列化,您的视图可以读取这些数据。创建一个映射器将对象映射到可以转换为 json 的 dict 的实用函数。并且请更改您不想“打印postgres查询”的标题您要返回查询结果的标题
  • 哇,兄弟,你能用更简单的方式解释一下吗?我根据您的要求更改了标题。

标签: python html postgresql flask cs50


【解决方案1】:

一个问题是 book.html 中的 &lt;form method="POST" action="/login"&gt;。它正在将用户发送回登录页面。 From the spec,看来books 路由来自search 页面(“评论”尚未实现)。 “书”页面应该允许用户输入评级和评论,并且在提交时可能会更新数据库中的“评论”表(如第一个提示所建议的那样)。看起来书页不完整。

结果中的这一行result = request.form()可能给出了 TypeError,因为form 是根据flask doc 的 MultiDict。将() 添加到末尾看起来像一个可调用函数。

表格

带有来自 POST 或 PUT 请求的已解析表单数据的 MultiDict。请记住,文件上传不会在这里结束,但 而是在 files 属性中。


错误消息TypeError: 'ImmutableMultiDict' object is not callable 应该给出一个行号。可能与在没有 username 和 passsword 请求表单参数的情况下调用 login 有关。

【讨论】:

  • 很抱歉。我已经解决了。如果您现在可以提供帮助,那将是非常有帮助的。
  • 确保当前代码发布有问题。并且 TypeError 应该给出确切的行,将其添加到问题中。答案已编辑。
  • 它在线路上给出线路错误:result = request.form()
  • 它在行上给出行错误:result = request.form()。所以我的计划是这样的:在登录页面之后,用户会得到一个搜索页面,他可以在其中输入书籍的详细信息,然后他将被重定向到名为books.html的页面,在那里他可以选择他想要的书使用,点击后可以进入 book.html 提交评论和阅读说明。
猜你喜欢
  • 1970-01-01
  • 2012-08-15
  • 2018-01-07
  • 2016-06-10
  • 2016-01-12
  • 1970-01-01
  • 2015-05-06
  • 2018-07-28
  • 1970-01-01
相关资源
最近更新 更多