【发布时间】: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