Я делаю приложение для обзора книг, и мой код python выглядит следующим образом: (Нерелевантные части удалены, могу добавить по запросу)
from flask import Flask, render_template, request, session, redirect, url_for, jsonify
from flask_session import Session
from flask_login import LoginManager, login_user, logout_user, login_required, current_user
from models.model import * # The models.model file contains my classes' info.
app = Flask(__name__)
app.config["SECRET_KEY"] = b"<sth>"
app.config['SESSION_TYPE'] = 'filesystem'
app.config["SQLALCHEMY_DATABASE_URI"] = '<myURI>'
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
db.init_app(app)
Session(app)
login_manager = LoginManager()
login_manager.login_view = 'index'
login_manager.init_app(app)
@app.route("/search/isbn/<isbn>")
@login_required
def isbn(isbn):
book = Book.query.get(isbn)
reviews = Review.query.get(isbn)
return render_template("isbn.html", results=book, reviews=reviews)
@app.route("/search/isbn/<isbn>/review", methods=["POST"])
@login_required
def review(isbn):
review = request.form.get("review_content")
rating = request.form.get('review_score')
print(session)
username = current_user
print(username)
r = Review(name=username, rating=rating, review=review)
db.session.add(r)
db.session.commit()
book = Book.query.get(isbn)
reviews = Review.query.get(isbn)
return render_template("isbn.html", results=book, reviews=reviews)
Файл isbn.html
содержит:
{% extends "layout.html" %}
{% block title %}
{{ results.title }}
{% endblock %}
{% block body %}
<script>
function show_value(x)
{
document.getElementById("slider_value").innerHTML=x;
}
</script>
<table class="table">
<tr>
<th>ISBN</th>
<th>Title</th>
<th>Author</th>
<th>Year of Publish</th>
</tr>
<tr>
<td>{{ results.isbn }}</td>
<td>{{ results.title }}</td>
<td>{{ results.author }}</td>
<td>{{ results.year }}</td>
</tr>
</table>
<form action="{{ url_for('review' , isbn=results.isbn) }}" method="post">
<div class="form-group">
<textarea placeholder="Write your review here..." class="form-control-lg" type = "text" name="review_content"></textarea>
</div>
<div class="form-group">
<strong id="slider_value">3</strong>
<input type='range' name="review_score" min="1" max="5" step="1" onchange="show_value(this.value);">
</div>
<div class="form-group">
<button class="btn btn-primary" type="submit">Submit Review</button>
</div>
</form>
<div class="reviews">
{% if not reviews == None %}
{% for review in reviews %}
<div class="review">
<p>{{review.review}}</p>
</div>
<p>Written by {{ review.name }}</p>
{% endfor %}
{% endif %}
</div>
{% endblock %}
Когда я запускаю код, возникает ошибка:
127.0.0.1 - - [28/May/2020 08:56:43] "POST /search/isbn/0545654742/review HTTP/1.1" 500 -
Traceback (most recent call last):
File "/Users/scythia/Desktop/Project1/venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1284, in _execute_context
cursor, statement, parameters, context
File "/Users/scythia/Desktop/Project1/venv/lib/python3.7/site-packages/sqlalchemy/engine/default.py", line 590, in do_execute
cursor.execute(statement, parameters)
psycopg2.ProgrammingError: can't adapt type 'LocalProxy'
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/Users/scythia/Desktop/Project1/venv/lib/python3.7/site-packages/flask/app.py", line 2464, in __call__
return self.wsgi_app(environ, start_response)
File "/Users/scythia/Desktop/Project1/venv/lib/python3.7/site-packages/flask/app.py", line 2450, in wsgi_app
response = self.handle_exception(e)
File "/Users/scythia/Desktop/Project1/venv/lib/python3.7/site-packages/flask/app.py", line 1867, in handle_exception
reraise(exc_type, exc_value, tb)
File "/Users/scythia/Desktop/Project1/venv/lib/python3.7/site-packages/flask/_compat.py", line 39, in reraise
raise value
File "/Users/scythia/Desktop/Project1/venv/lib/python3.7/site-packages/flask/app.py", line 2447, in wsgi_app
response = self.full_dispatch_request()
File "/Users/scythia/Desktop/Project1/venv/lib/python3.7/site-packages/flask/app.py", line 1952, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/Users/scythia/Desktop/Project1/venv/lib/python3.7/site-packages/flask/app.py", line 1821, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/Users/scythia/Desktop/Project1/venv/lib/python3.7/site-packages/flask/_compat.py", line 39, in reraise
raise value
File "/Users/scythia/Desktop/Project1/venv/lib/python3.7/site-packages/flask/app.py", line 1950, in full_dispatch_request
rv = self.dispatch_request()
File "/Users/scythia/Desktop/Project1/venv/lib/python3.7/site-packages/flask/app.py", line 1936, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/Users/scythia/Desktop/Project1/venv/lib/python3.7/site-packages/flask_login/utils.py", line 272, in decorated_view
return func(*args, **kwargs)
File "/Users/scythia/Desktop/Project1/application.py", line 181, in review
db.session.commit()
File "/Users/scythia/Desktop/Project1/venv/lib/python3.7/site-packages/sqlalchemy/orm/scoping.py", line 163, in do
return getattr(self.registry(), name)(*args, **kwargs)
File "/Users/scythia/Desktop/Project1/venv/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 1042, in commit
self.transaction.commit()
File "/Users/scythia/Desktop/Project1/venv/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 504, in commit
self._prepare_impl()
File "/Users/scythia/Desktop/Project1/venv/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 483, in _prepare_impl
self.session.flush()
File "/Users/scythia/Desktop/Project1/venv/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 2523, in flush
self._flush(objects)
File "/Users/scythia/Desktop/Project1/venv/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 2664, in _flush
transaction.rollback(_capture_exception=True)
File "/Users/scythia/Desktop/Project1/venv/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py", line 69, in __exit__
exc_value, with_traceback=exc_tb,
File "/Users/scythia/Desktop/Project1/venv/lib/python3.7/site-packages/sqlalchemy/util/compat.py", line 178, in raise_
raise exception
File "/Users/scythia/Desktop/Project1/venv/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 2624, in _flush
flush_context.execute()
File "/Users/scythia/Desktop/Project1/venv/lib/python3.7/site-packages/sqlalchemy/orm/unitofwork.py", line 422, in execute
rec.execute(self)
File "/Users/scythia/Desktop/Project1/venv/lib/python3.7/site-packages/sqlalchemy/orm/unitofwork.py", line 589, in execute
uow,
File "/Users/scythia/Desktop/Project1/venv/lib/python3.7/site-packages/sqlalchemy/orm/persistence.py", line 245, in save_obj
insert,
File "/Users/scythia/Desktop/Project1/venv/lib/python3.7/site-packages/sqlalchemy/orm/persistence.py", line 1136, in _emit_insert_statements
statement, params
File "/Users/scythia/Desktop/Project1/venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1020, in execute
return meth(self, multiparams, params)
File "/Users/scythia/Desktop/Project1/venv/lib/python3.7/site-packages/sqlalchemy/sql/elements.py", line 298, in _execute_on_connection
return connection._execute_clauseelement(self, multiparams, params)
File "/Users/scythia/Desktop/Project1/venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1139, in _execute_clauseelement
distilled_params,
File "/Users/scythia/Desktop/Project1/venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1324, in _execute_context
e, statement, parameters, cursor, context
File "/Users/scythia/Desktop/Project1/venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1518, in _handle_dbapi_exception
sqlalchemy_exception, with_traceback=exc_info[2], from_=e
File "/Users/scythia/Desktop/Project1/venv/lib/python3.7/site-packages/sqlalchemy/util/compat.py", line 178, in raise_
raise exception
File "/Users/scythia/Desktop/Project1/venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1284, in _execute_context
cursor, statement, parameters, context
File "/Users/scythia/Desktop/Project1/venv/lib/python3.7/site-packages/sqlalchemy/engine/default.py", line 590, in do_execute
cursor.execute(statement, parameters)
sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) can't adapt type 'LocalProxy'
[SQL: INSERT INTO reviews (id, name, bookisbn, review, rating) VALUES (nextval('integers'), %(name)s, %(bookisbn)s, %(review)s, %(rating)s) RETURNING reviews.id]
[parameters: {'name': <User 2>, 'bookisbn': '0545654742', 'review': 'Great book.', 'rating': '3'}]
(Background on this error at: http://sqlalche.me/e/f405)
Я проверил сайт sqlalchemy, но не смог найти проблему. Может ли кто-нибудь мне помочь?
Python версия: 3.7.7
Flask версия: 1.1.2
Flask -sqlalchemy версия: 2.4.1
версия psycopg2: 2.8.5