0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

diagramsが興味深かったのでflaskでwrapしてみた

Posted at

diagramsとは

pythonでアーキテクチャ図が書けてしまうソフトウェアです。

数日前に目について、以下のようなことをやりたいと思ったのが作った動機でした。

<img src='http://localhost:8080/?
with Diagram("Grouped Workers", show=False, direction="TB"):
    ELB("lb") >> [EC2("worker1"),
                  EC2("worker2"),
                  EC2("worker3"),
                  EC2("worker4"),
                  EC2("worker5")] >> RDS("events")

とりあえず、えいやっと作ってみる

10時間程度格闘して作成してみました。
ソースコード一式は、以下のリポジトリです。

Pythonのコードをコンパイルする

まずはなんと言っても問題になるのはURLで渡されてくるPythonのソースコードをどうやってコンパイルするか?です。query_stringから取得するのはよしとしても、整形してからコンパイルしないとダメです。
ライブラリとしてはyapfを利用させていただきました。

【課題】そもそもquery_stringには改行コードがない

examplesに掲載されている通りにimport文も含めて、記載してもらう予定でした。
しかし、query_stringには```... import EC2from ...`````のようにくっついており整形しても分離は(当たり前ですが)できませんでした。

ASTを使って引数を変更する

こちらは、想定通りの動きが実装できました。NodeTransformerを使用し書き換えてコンパイルしてexecで実行です。
途中linenoとかがないとかエラーが出たのですがast.fix_missing_locationで無事に解決しました。(したと思っている・・・)

アイコンのリクエストを無理やり・・・

svgで出力するとアイコンのリクエストが別途発生します。
Flaskのrouteで無理やり処理しました。(docker内で実行しているから許されるはず!?)

その他の課題

頑張って作ってみたものの色々と問題があるなーって思っています。

  • 受け取ったPythonのコードをそのまま実行するので、インターネットに公開したらダメです。docker内で実行しているから限定的に大丈夫なのか、どうか判断つきませんでした。(何かしら叩けばセキュリティホールがあるはず)
  • 上に書いてあるサンプル以外で試したところ、Syntax Errorになってしまいました。詳細は調べていません。
  • URLのところに/pngとか指定すると、そのファイル形式で作成されますが、文字化けしてしまいます・・・。(dockerで実行時。開発時のpython server.pyで実行する分には問題なし)
  • 出力された画像ファイルが/workフォルダ内に溜まります。削除は行っていません。

本来であればissueで書くべきですね・・・。

なぜかタイムトライアル的な気分で突っ走ってリリースしてみました。
この後は腰を据えて対応していきたいと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?