タイトル : サンプル3.APIでPOSTする、ファイルの格納 AppSuite
更新日 : 2024-11-21
カテゴリ : プログラミング
UI作成
サンプルのUIは以下。
実行例
$ 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'}
$
なるほど。レポート作成して確認する時に便利ですね。
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)