【问题标题】:Flask-sqlalchemy problem: can't adapt type 'LocalProxy'Flask-sqlalchemy 问题:无法适应类型“LocalProxy”
【发布时间】:2020-09-15 05:13:40
【问题描述】:

我正在做一个书评app,我的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

【问题讨论】:

    标签: python flask sqlalchemy flask-sqlalchemy psycopg2


    【解决方案1】:

    您的问题是username 变量来自current_user,其类型为&lt;class 'werkzeug.local.LocalProxy'&gt;

    您也可以通过type(current_user)查看以上内容

    所以我认为您需要将用户名插入 Review 映射类中,您可以简单地这样做

    username = current_user.name
    

    而不是

    username = current_user
    

    另外,您的用户模型中可能没有名称列,或者您可能有一个用户名列。因此,在这种情况下,请使用您想在名称列中插入的任何列名称,用于 Review 映射类。

    【讨论】:

    • 谢谢!问题已解决。我刚刚将 current_user 更改为 current_user.username(我的 Mixin 类是一个用户名列)并且它起作用了。
    猜你喜欢
    • 2014-12-25
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多