タイトル : サンプル3.APIでPOSTする、ファイルの格納 AppSuite
更新日 : 2024-11-21
カテゴリ : プログラミング
タグ :
desknets   
appsuite   
python   

AppSuite 少し再確認 2024

UI作成

サンプルのUIは以下。

図1

実行例

  • アプリで入力値を入れる

    図1

  • pythonプログラムを動かす

$ python sample03_1.py
データID : 1  入力値 : 123
結果 : [1, 3, 41, 123]
<Response [200]> {'status': 'ok', 'servertime': '20241121162757', 'ID': '1'}
データID : 2  入力値 : 109
結果 : [1, 109]
<Response [200]> {'status': 'ok', 'servertime': '20241121162800', 'ID': '2'}

$
  • 結果の確認 一覧表示

    図1

    詳細表示

    図1

    PDFの内容を確認 図1

 なるほど。レポート作成して確認する時に便利ですね。

Pythonプログラム

データ参照API : action= update_data を使います。

ドキュメントは AppSuite(付録) の AppSuite APIの仕様 - データ変更API です。

import requests
import io
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4, portrait
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.cidfonts import UnicodeCIDFont

# appsr.cgiのURL
APPSR_URL = "http://localhost:8081/cgi-bin/dneo/appsr.cgi"
# アクセスキー
ACCESS_KEY = "uSRV1w8X2IWtJrxyDpWXxKy1EEEEV0w83CIQcLRH0b4"
# アプリケーションID
APP_ID = "sample03"

# アプリに接続するURL
url = f"{APPSR_URL}"


def make_divisors(n):
    """約数を高速で列挙するコード(Python)
    https://qiita.com/LorseKudos/items/9eb560494862c8b4eb56
    """
    lower_divisors , upper_divisors = [], []
    i = 1
    while i*i <= n:
        if n % i == 0:
            lower_divisors.append(i)
            if i != n // i:
                upper_divisors.append(n//i)
        i += 1
    return lower_divisors + upper_divisors[::-1]


def make_pdf(input_value, divisors):
    """PDFファイルを作成し、その内容をバイナリーで返す
    """
    pdf_data = io.BytesIO()
    pdf_canvas = canvas.Canvas(pdf_data, pagesize=portrait(A4))

    # 各種フォントを使用できるようにする。
    # HeiseiMin-W3、HeiseiKakuGo-W5は最初から使える
    font_name = "HeiseiMin-W3"
    pdfmetrics.registerFont(UnicodeCIDFont(font_name))

    # 表示位置
    px = 50
    py = 750

    # フォント指定。サイズも指定
    pdf_canvas.setFont(font_name, 16)
    # フォント名表示
    pdf_canvas.drawString(px, py, f"入力値は {input_value}です")
    py -= 20
    #テスト文字表示
    pdf_canvas.drawString(px, py, f"約数は {divisors}です")
    py -= 30
    #テスト文字表示
    pdf_canvas.drawString(px, py, "素数です" if len(divisors) == 2 else "素数ではありません") 

    # PDFファイルを保存
    pdf_canvas.save()

    pdf_data.seek(0)

    return pdf_data.read()

try:
    # データ一覧を取得
    response = requests.get(f"{url}?access_key={ACCESS_KEY}&app_id=@{APP_ID}&action=list_data")
    json_data = response.json()

    for one_data in json_data["list"]["item"]:
        # 計算してなかったら計算します
        if one_data["ステータス"]["val"] == "計算前":
            # データIDを取得
            data_id = int(one_data["データID"]["val"])
            input_value = int(one_data["入力値"]["val"])
            print(f"データID : {data_id}  入力値 : {input_value}")

            # 計算
            divisors = make_divisors(input_value)
            print(f"結果 : {divisors}")

            # レポート作成(PDFファイルを作成し結果をByteIOで返す)
            bytes_data = make_pdf(input_value, divisors)

            # POSTする辞書を用意
            result = {
                'action': 'update_data',
                'access_key': ACCESS_KEY,
                'app_id': f'@{APP_ID}',
                # 変更対象となるデータのデータIDを指定します。
                'data_id': data_id,
                # 必ず指定してください。指定した値とデータのレビジョン番号が一致するか検証されます。
                # 0を指定すると、検証されません。
                '{{revision}}': 0,
                # 書き替えたいデータ
                '{{ステータス}}': "成功",
                '{{結果}}': str(divisors)
            }
            # ファイルを格納
            files = {'{{結果ファイル}}': (f"result_{data_id}.pdf", bytes_data, 'application/octet-stream')}

            # アプリにPOSTする
            response = requests.post(url, result, files=files)
            json_data = response.json()
            print(response, json_data)

except Exception as e:
    print(e)