1

オブジェクトを要求したユーザーに属するオブジェクトのみを返す API は、どのように正しく表示されるのでしょうか?

api/version/items/<items_id>

また

api/version/user/<user_id>/items/<items_id>

最初のケースでは、サーバーは認証から取得したユーザー ID を使用してデータベースにクエリを実行しました。

Flask-restless で両方のケースを作成する方法がわかりません。user_id を認証 (JWT トークン) から取得できるプリプロセッサが役立つと思いますが、それを DB の検索パラメータとして使用する方法が見つかりません。

from flask_jwt import JWT, jwt_required, current_user
...
manager.create_api(Item,
               methods=['GET'],
               collection_name='items',
               url_prefix='/api',
               preprocessors=dict(GET_SINGLE=[api_auth],GET_MANY=[api_auth]))   


@jwt_required()
def api_auth(*args, **kwargs):
    user_id = current_user.id
    # some code with user id addition.
    pass
4

2 に答える 2

0

クエリしようとしているリソースを直接参照するエンドポイントを使用する必要があります。例えば:

api/version/items

get_singleget_manyプリプロセッサを別々に定義する必要があります。instance_id単一 (整数) の および複数のプリプロセッサの引数result(辞書) を使用して、ユーザーに返されるものを定義する必要があります。

Flask-restless docsから:

辞書をパラメータとして受け入れるプリプロセッサとポストプロセッサは、その引数をその場で変更できます (また変更する必要があります)。これは、たとえば、結果ディクショナリに加えられた変更が Flask-Restless ビュー関数によって表示され、最終的にクライアントに返されることを意味します。

したがって、プリプロセッサでは、次のようなことを実行して、データベース内のアイテム (ユーザーとの関係で定義されたもの) を取得できます。

@jwt_required()
def api_auth_get_many(instance_id=None, *args, **kwargs):
    user_id = current_user.id

    if instance_id in User.query.get(user_id).items:
        pass
    else:
        instance_id = None    # Do not return the value if not permitted

@jwt_required()
def api_auth_get_many(result=None, *args, **kwargs):
    user_id = current_user.id
    result = User.query.get(user_id).items   # Return all items allowed for user
于 2015-11-12T17:04:11.417 に答える