Flask проблема -sqlalchemy: не удается адаптировать тип LocalProxy - PullRequest
1 голос
/ 28 мая 2020

Я делаю приложение для обзора книг, и мой код 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

1 Ответ

0 голосов
/ 28 мая 2020

Ваша проблема здесь - переменная username, которая исходит из current_user и имеет тип <class 'werkzeug.local.LocalProxy'>.

Вы также можете проверить это, набрав type(current_user)

Итак, я думаю, вам нужно имя пользователя для вставки в сопоставленный класс Review, для которого вы можете просто сделать

username = current_user.name

вместо

username = current_user

Кроме того, есть вероятность, что у вас может не быть столбца имени в вашей модели пользователя или вместо него может быть столбец имени пользователя. Поэтому в этой ситуации используйте любое имя столбца, которое вы хотите вставить в столбец имени для сопоставленного класса Review.

...