6

REST インターフェイスを公開するファイル共有アプリケーションを作成しようとしています。

私が使用しているライブラリである Flask-RESTful は、デフォルトでJSON を返すことのみをサポートしています。明らかに、JSON を介してバイナリ データを提供しようとすることは、まったくお勧めできません。

GET メソッドを介してバイナリ データを提供する最も「RESTful」な方法は何ですか? JSON以外のさまざまなデータ表現を返すことをサポートするためにFlask-RESTfulを拡張することは可能であるように見えますが、ドキュメントは不足しており、それが最善のアプローチであるかどうかはわかりません.

4

3 に答える 3

9

Flask-RESTful ドキュメントで提案されているアプローチは、Api オブジェクトでサポートされている表現を宣言して、他のメディアタイプをサポートできるようにすることです。探しているメディアタイプは ですapplication/octet-stream

まず、表現関数を書く必要があります:

from flask import Flask, send_file, safe_join
from flask_restful import Api

app = Flask(__name__)
api = Api(app)

@api.representation('application/octet-stream')
def output_file(data, code, headers):
    filepath = safe_join(data["directory"], data["filename"])

    response = send_file(
        filename_or_fp=filepath,
        mimetype="application/octet-stream",
        as_attachment=True,
        attachment_filename=data["filename"]
    )
    return response

この表現関数が行うことはdata, code, headers、メソッドの戻り値Responseを mimetype を持つオブジェクトに変換することですapplication/octet-stream。ここでは、関数を使用してこのオブジェクトsend_fileを構築します。Response

私たちのGET方法は次のようになります。

from flask_restful import Resource

class GetFile(Resource):
    def get(self, filename):
        return {
            "directory": <Our file directory>,
            "filename": filename
        }

必要なコーディングはこれだけです。このリクエストを送信するときは、API が表現関数を呼び出すように、 MIME タイプをGETに変更する必要があります。それ以外の場合は、デフォルトで JSON データが返されます。AcceptApplication/octet-stream

githubxmlに例があります

この質問は7年前に尋ねられたことを知っているので、おそらく@Ayrxにとってはもう問題ではありません。立ち寄る人の役に立てば幸いです。

于 2021-01-17T09:50:09.990 に答える
5

Content-Typeそれに応じてヘッダーを設定し、クライアントから送信されたヘッダーを尊重している限り、必要Acceptな形式を自由に返すことができます。application/octet-streamコンテンツ タイプでバイナリ データを返すビューを持つことができます。

于 2013-11-10T15:06:06.320 に答える