1

Flask アプリケーション用の API を実装する必要があり、 Flask-Restless. 私は、このライブラリの基本的な使用法だけで壁のようなものに遭遇しました。これを使用したことがある人が助けてくれることを願っています。

API マネージャーとエンドポイントを作成しています...

manager = APIManager(app, flask_sqlalchemy_db=db)
manager.create_api(Gallery, methods=['GET', 'POST', 'PUT', 'DELETE'])

...そしてそれに対応するモデル

class Gallery(db.Model):
    __tablename__ = 'galleries'
    id = db.Column(db.Integer, primary_key=True)

    title = db.Column(db.String(25))

    def __init__(self, title):
        self.title = title

ここで、新しいエントリを挿入するために、この jQuery ajax POST リクエストを使用します。これはうまくいきます。sqlite db ビューアーでテストしたところ、エントリが表示されました。

$('#form').on('submit', function(e){
        $.ajax({
            type: 'post',
            url: '/api/galleries',
            contentType:"binary/octet-stream",
            data: JSON.stringify({'title': $('#title').val()}),
            success: function(){
                alert('Success!');
            }
        });
        e.preventDefault();
    });

これが問題です。ブラウザでにアクセスするhttp://localhost:5000/api/galleriesと、次のメッセージが表示されます。

sqlalchemy.orm.exc.NoResultFound
NoResultFound: one() の行が見つかりませんでした

api/galleriesデータベースエントリのリストを返す必要があるときに one() を実行しようとするのは奇妙です。私api/galleries/1はまったく同じエラーを取得しようとします。再確認したところ、プライマリ ID は 1 です。何が欠けていますか?

4

1 に答える 1

1

今日同じ問題が発生し、いくつかの回避策で解決しました。

私のモデルは次のようになります。

    class User(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        ...

    class Key(db.Model):
        user_id = db.Column(db.Integer, db.ForeignKey('auth_user.id'))
        user = db.relationship('User', backref=db.backref('keys', lazy='dynamic'))
        ...

原因:

クエリを実行すると、同じエラー メッセージが表示されましたusers。そして、flask-restless が関連するクエリを実行しようとしていることがわかりましたkeysusers残念ながら、keyテーブルが空で、エラー メッセージが表示されました。

回避策:

API の作成時に列を除外するには、include_columnsまたはexclude_columnsを使用します。keys

    api_mgr.create_api(User, include_columns = ['email', 'username'])

また:

    api_mgr.create_api(User, exclude_columns = ['keys', 'SOME_OTHER_COLUMNS'])

問題の原因となっている関連テーブルがあるかどうかを確認できます。それが原因である場合は、include_columnsまたはexclude_columnsキーワード引数を使用できます。

于 2013-01-04T17:58:55.947 に答える