Python以前の記事でBottleを使ったAPIを作成しました。ここではもうちょっと進んだ例を書いていきたいと思います。ここでのアプリケーションは、事前に指定されたファイルシステム上のあるディレクトリの中で、ファイルやサブディレクトリを作成する、というものです。書ききれなかったその他は別記事で。仕様というほどでもありませんが、期待動作を決めておきましょう。要はリクエストを解析し、ファイルを操作するPython標準モジュールの機能(os.listdir()やos.remove()、open()など)を呼び出すことで実現します。指定されたIDのアイテムを削除するBottleの良さを活かす意味で、できるだけPython標準のモジュールのみで実装したいと思います。3.6)でも動くようにしたいと思います。ここではGitを介して転送しています。検証した環境は以下の通りです。2.7.5サーバの変更Bottleのオプションとして、HTTPリクエストを処理するサーバ部分を変更することができます。別途インストールする必要があります。WSGI参照実装)は開発用途向けなのだそうで、確かにもっさりしているかも。Pythonに速度を求められないよなあと思いながら、実用向けと言われているものを試してみます。公式サイトはWSGIに対応した実装なら何でもいけるぜ!と言っていますが、ソースを見ると確かに結構な数が列挙されています(下記)。シンプルさと性能で、ここではWaitressを使うことにしました。AutoServer,}公式の説明によると、WaitressはPythonスクリプトとして動くのではなく、その下のCPython(C言語で実装されたPythonのインタプリタ)を直接たたいているので高速に動作するのだそうです。簡単にpipでインストールしておきましょう。下記はUbuntuのaptを使った例です。waitressAPIの実装やっと本題です。ファイル構成は次のようにしました。前記事ではフラットにおいていましたが、のちのちモジュールを増やすことを想定してサブディレクトリに配置しました。Python3では必須ではありませんが、Python2向けに__init__.pyファイルも置いておきます。root)├─app.py└─libs├─__init__.py├─bottle.py├─routes.py└─utils.py以下にそれぞれの詳細を記載しておきます。app.pyapp.pyでは各モジュールのインポートと、エントリポイントを書いておきます。ここでは、全てのセグメントからアクセスを受け付け、スクリプト実行時の引数(sys.argv)でリッスンポートとサーバを指定できるようにしています。routes.pyroutes.pyにルーティングを定義しています。基本的には、クライアントからのリクエストに応じて、別ファイルに記載したutilsモジュールを呼んでいます。ロジックに必要なモジュールへの依存性は極力utilsモジュールに押し込め、ここでのインポートを最低限にします。(400)で応答しています。utils.pyutils.pyではルーティングから呼ばれる機能を実装しています。GETリクエストには、ハードコードされたディレクトリ(base_dir)にあるアイテム(ディレクトリやファイル)を取得してリストオブジェクトを作成し、JSON文字列として返します。POSTやPUTリクエストに対しては、ID(item_id)を使ってアイテムを作成・変更します。item"}))スクリプトは見たままですが、以下に詳細を解説しておきます。APIという本旨からは脱線するので、読み飛ばしても大丈夫です。LinuxとWindowsの判別LinuxとWindowsではパスの体系が違うので、platformモジュールを使って判別します。tuple)の最初の要素がOSの違いを格納しているので、それを使って操作対象にするディレクトリ(base_dir)を切り替えています。"/home/{}/data".format(os.environ['USER'])大抵のLinuxでは環境変数$USERにユーザ名が格納されているので、これをos.environ()で参照してホームディレクトリのパスを取得しています。条件式は次のような書き方でも同じことです。platform.uname():...IDの作成ここではID(item_id)をUUID(uuidモジュール)を使って作成しています。アイテムの実体はファイルシステム上のディレクトリまたはファイルなので、重複しない文字列が必要です。ここではuuid.uuid4()メソッドが返す値を文字列(string型)にフォーマットしていますが、例えば時刻を使っても(まず無いと思いますが作成タイミングが重複しなければ)一意な文字列を作れます。私の場合、コーディングとデバッグはPython3環境(Windows)で、実行はPython2環境(Linux)で実施しています。そこで、Python3でデバッグしたものがPython2でも通るようにする必要があります。3to2を使うなどやり方はいろいろあるのですが、ここではそう複雑なことをしていないので、書き方に注意するくらいで基本的には同じコードを使うことにします。Python2からPython3では、print文が関数へ変更されていますが、Python3の書き方をしておけばPython2(ここでは2.7)でも通ります。Python2ではサブディレクトリに配置したモジュールを認識させるため__init__.pyを作成しておく(空でok)必要があります。__init__.pyは置いておくだけならPython3でも動作に影響しないので、こちらはPython2に合わせています。アプリケーションの実行WindowsでもLinuxでも同じコマンドで実行できます。下記はLinuxでの実行例です。操作対象となるディレクトリを忘れずに作成しておきます。Linuxの場合はパーミッションに注意が必要ですが、ディレクトリの所有者と同じユーザで実行すればまず大丈夫でしょう。quit.実際にリクエストを投げてみましょう。POST(アイテム作成)メソッドのパラーメータitemtypeでアイテムの種類を指定すると、同期的に指定された種類のものを作成したあと、新規に付与したIDを応答します。"file"}GETリクエストでディレクトリにあるファイルとディレクトリの情報を取得できます。-1}]POSTリクエストでは、対象がファイルのIDを指定した場合、リクエストのボディにセットされたJSONデータで上書きします。(400)を応答していることがわかります。741その他の話題は続きで。usta関連記事pysmbを使ってPythonでWindowsファイルサーバにアクセスするWindowsファイルサーバ(SMB)をスクリプトから操作するとき、ネイティブにはPowerShellですが、Pythonで実装するとLin...記事を読むdatetimeモジュールによる時刻の扱いどのプログラミング言語/スクリプトでも、時刻と文字列の変換は頻出の処理ですね。~レボリューションズ~別記事の続きです。Storageは従量課金なので、できるだけ通信量や消費容量を削減したいですね。Azure側でのレプリケーシ...記事を読むElasticsearchをセットアップするElasticsearchは全文検索エンジン。(セットアップ~VM電源操作)仮想マシン環境と言えば色々ありますが、個人的にはVirtualBoxがPC環境でも使いやすいと思っています。安定性や品質、機能面では他の仮想...記事を読むPythonでディレクトリ圧縮(zipファイル作成)Windowsのエクスプローラを使っていると、コンテキストメニューからzipアーカイブファイルを作成することができますが、同じことをPyth...記事を読むPowerShellとPythonで性能情報を取得するたまに性能情報を取得したいことがありますが、スクリプトでできると便利ですよね。APIを作成する~おかえり~前記事までに書ききれなかった話題をちょっと続けます。StorageをPythonから操作する、前記事の続きです。工夫したものは別の記事に分けていますので最終形態はそ...記事を読むInfluxDBとGrafanaで作るサーバ監視環境Grafanaはデータの視覚化ツールとして人気ですね。今回はInfluxDBをデータソースとして性能監視環境を構築した際のメモです。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。