コンテンツにスキップ

スクリプト開発 / 関数の作成と呼び出し

このドキュメントは、DataFlux Func 上でスクリプトを開発するための最も基本的なドキュメントです。読むことで、DataFlux Func 上で最も基本的な開発・利用作業を行うことができます。

1. 事前の注意

DataFlux Func の利用中に、

複数人で同じアカウントにログインしたり、複数人で同じコードを同時に編集したりしないでください。

コードの相互上書きや消失を防ぐためです。

2. 最初の関数を作成して呼び出す

DataFlux Func でのコード作成は、通常の Python コード作成と大きな違いはありません。 API としてエクスポートする必要がある関数には、組み込みの @DFF.API(...) デコレーターを追加するだけで実現できます。

関数の戻り値はインターフェースの戻り値であり、戻り値が dictlist の場合、システムは自動的に JSON として返します。

典型的な関数は次のとおりです:

Python
1
2
3
4
5
6
@DFF.API('Hello, world')
def hello_world(message=None):
    ret = {
        'message': message
    }
    return ret

DataFlux Func プラットフォームでは、DFF.API(...) で修飾されたこのような関数を呼び出すための複数の方法が提供されています:

実行機能 特長 適用シーン
同期実行の関数 API 同期 HTTP API を生成します。呼び出し後、処理結果を直接返します 処理時間が短く、クライアントが即座に結果を取得する必要がある場合
非同期実行の関数 API 非同期 HTTP API を生成します。呼び出し後すぐに応答しますが、処理結果は返しません 処理時間が長く、API 呼び出しが起動シグナルとしてのみ使用されるシーン
定期実行タスク Crontab 構文に基づいて自動実行します 定期的な同期 / データキャッシュ、定期実行タスクなどの場合

ここで、この関数に関数 API を作成すると、パブリックネットワーク経由の HTTP でこの関数を呼び出せるようになります。

この関数用に作成した「関数 API」の ID が func-api-xxxxx であるとすると、この関数を呼び出す最も簡単な方法は次のとおりです:

Text Only
1
GET /api/v1/al/func-api-xxxxx/s?message=Hello

レスポンスは次のとおりです(一部省略):

Text Only
1
2
3
4
HTTP/1.1 200 OK
Content-Type: application/json

{"message":"Hello"}

3. ファイルアップロードに対応した関数を作成する

DataFlux Func は、関数 API を介したファイルアップロードにも対応しています。

アップロードされたファイルを処理する必要がある場合は、関数に files パラメーターを追加して、アップロードされたファイル情報を受け取ることができます。 ファイルがアップロードされると、DataFlux Func は後続の処理のためにスクリプトが利用できる一時アップロードディレクトリに自動的に保存します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# Excel ファイルを受け取り、Sheet1 の内容を返す
from openpyxl import load_workbook

@DFF.API('Excel を読み込む')
def read_excel(files=None):
    excel_data = []
    if files:
        workbook = load_workbook(filename=files[0]['filePath'])
        for row in workbook['Sheet1'].iter_rows(min_row=1, values_only=True):
            excel_data.append(row)

    return excel_data

files パラメーターは DataFlux Func システムによって自動的に入力されます。内容は次のとおりです:

JSON
1
2
3
4
5
6
7
8
9
[
    {
        "filePath"    : "<ファイルの一時保存先>",
        "originalname": "<ファイルの元のファイル名>",
        "encoding"    : "<エンコーディング>",
        "mimetype"    : "<MIME タイプ>",
        "size"        : "<ファイルサイズ>"
    }
]

ファイルアップロードのサンプルコマンドは スクリプト開発 / 基本概念 / 関数 API / POST 簡略化パラメーター送信 を参照してください。

4. 非 JSON・Form データを受け取る

1.6.9 バージョンで追加

場合によっては、リクエストがサードパーティのシステムやアプリケーションによって独自の形式で送信され、リクエストボディが JSON や Form 形式ではないことがあります。その場合は、**data を入力パラメーターとして使用し、POST 簡略化形式で呼び出すことができます。

システムは、テキストや解析できないデータを受信した場合、自動的に { "text": "<テキスト>" } または { "base64": "<Base64 形式のバイナリデータ>"} にパッケージ化し、関数に渡します。

サンプルコードは次のとおりです:

Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import json
import binascii

@DFF.API('任意形式の Body を受け入れる関数')
def tiger_balm(**data):
    if 'text' in data:
        # リクエストボディがテキストの場合(例: Content-Type: text/plain)
        # `data` パラメーターには、内容を格納する単一の `text` フィールドが常に含まれます
        return f"テキスト: {data['text']}"

    elif 'base64' in data:
        # リクエストボディが解析できない形式の場合(Content-Type: application/xxx)
        # `data` パラメーターには、単一の `base64` フィールドが常に含まれ、リクエストボディの Base64 文字列が格納されます
        # Base64 文字列は `binascii.a2b_base64(...)` を使用して Python のバイナリデータに変換できます
        b = binascii.a2b_base64(data['base64'])
        return f"Base64: {data['base64']} -> {b}"

リクエストボディがテキストの場合

リクエストは次のとおりです:

Bash
1
curl -X POST -H "Content-Type: text/plain" -d 'hello, world!' http://localhost:8089/api/v1/al/auln-unknown-body/s

出力は次のとおりです:

Text Only
1
テキスト: hello, world!

リクエストボディが未知の形式の場合

リクエストは次のとおりです:

Bash
1
curl -X POST -H "Content-Type: unknown/type" -d 'hello, world!' http://localhost:8089/api/v1/al/auln-unknown-body/s

出力は次のとおりです:

Text Only
1
Base64: aGVsbG8sIHdvcmxkIQ== -> b'hello, world!'