概要Dockerを使うことで素早く環境をセットアップしたり、同じような環境をみんなで利用したり、といったことが可能です。いった面でも便利なのですが、今回はプログラムの実行環境としてDockerを利用します。今回作るようなオンライン実行環境では、プログラム上からサーバーマシンの情報を不正に取得しようとしたり、悪意のあるコードが実行される可能性がありますが、Dockerを使う事でそれらを閉じられた仮想環境内で行うことができます。次のように、コードを入力するエディタがあって、print()などの出力も表示されています。エラーの場合もちゃんと出力されてますね。Githubにソースコードを置いているので、詳しいソースや試したい方はそちらを参考にしてください。Dockerの(本当に簡易的な)チュートリアル今回CentOS7で使う例です。他の環境の方は、コマンドを適宜置き換えてください。Dockerを以下のようにインストールし、スタートします。Hubには、様々なDockerイメージがあります。Pythonと検索するといくつか出てきますが、officialのものが良いです。REPOSITORYを使うことにします。次のコマンドで、Python環境が入っているDockerイメージを取得しましょう。python:3.73.7の部分は、他にも色々あるので、好きなものを入れて大丈夫です。scriptという項目がありますね。そこのコードを試しておきましょう。カレントディレクトリにて、適当にpythonファイルを作ります。main.pyとしましょう。World')そして、コードを試します。Worldと表示されれば、問題なく動いています。これをDjango上から呼び出すように作っていきましょう。Django上から呼び出す重要な部分だけ書いていきます。プロジェクト全体のソースコードは、Githubのソースコードを確認してください。historyディレクトリの作成プロジェクト直下、つまりmanage.pyと同じ階層にhistoryというディレクトリを作っておきます。この中に、各ユーザーが入力したPythonコードのファイルが格納されていきます。フォームの作成forms.pyに次のようなフォームを作っておきます。オンライン実行環境での、エディタ部分、プログラムを書く画面のフォームです。)ビューの作成views.pyにて、次のようなビューを定義しておきます。self.render_to_response(context)今回、ビューは1つだけです。self.render_to_response(context)送信ボタンが押されると、入力されたプログラムコード部分を受け取り、それをstart_docker()に渡し、それの実行結果を受け取ります。その実行結果とフォームオブジェクトをテンプレートファイルへ渡す、ということをします。self.render_to_response(context)start_docker()は、ドックストリングの通りDockerコンテナ内で入力されたPythonコードを実行し、結果を返します。runコマンドについて軽く説明すると、---rmは実行後にコンテナを削除するオプションです。-vは、ホストのディレクトリをコンテナ内のディレクトリにマウントします。"$PWD"はカレントディレクトリです。-wは、ワーキングディレクトリの指定になります。最初のチュートリアルで試したコマンドは、カレントディレクトリを/usr/src/myappにマウントしました。カレントディレクトリにmain.pyを作成していたので、/usr/src/myappにはmain.pyがある状態ですね。無事に実行できた、ということです。今回の処理は、ユーザーが書いたコードはhistoryディレクトリ内に2019-07-29T22:58:24.1111.pyのような形で保存され、historyディレクトリを/usr/src/myappにマウントしました。/usr/src/myappには2019-07-29T22:58:24.1111.pyがある状態です。2019-07-29T22:58:24.1111.pyのように実行している、ということです。最初のチュートリアルと殆ど変わらず、極力シンプルな処理にしました。ちなみにですが、今回の処理だとユーザーが他ユーザーの書いたファイルを覗けたりします。今回は1ページなので旨味がないのですが、一応共通のテンプレートファイルを作っておきます。base.htmlです。</body></html><style>内では、画面の高さのレイアウトを設定しています。Editorというプログラムを入力するためのエディタライブラリを読み込み・設定しています。プログラムを書いたりするメインのコンテンツ部分のテンプレートファイル、home.htmlを作ります。Posts関連記事はありません。分かり辛い質問になってしまい申し訳ございませんでした。記事ごと更新していただけるとは思ってもおらず、反応も遅れてしまい。本当にありがとうございます上げてくださったGithubにてファイル構成を確認させていただきました。見まねで作っていたものとあなた様のコードを比べ動かない理由がよくわかりました。syntaxと出てしまいました。構文エラーのようなのですが私が使用しているソフトウェアのバージョンがおかしいということなのでしょうか?Centos7に初期で内蔵されているpython2.7.5で実行したり、python3.6.8で実行してみたりしましたがなぜか同じ場所で引っかかってしまいます重ね重ね申し訳ございません。お時間あれば教えていただけると幸いですpythonバージョンは2.7.5ですが、python3.6コマンドで3.6.8も利用できるようにしています。週間前お返事が遅くなってしまいすみません。そのエラーの99%は、python2系で実行しているのが原因です。python3.6など、3系で実行するように、注意深くコマンドの実行、設定をしてください。記事を読ませていただき、大変勉強になりました。おひとつ、質問があるのですが、(DockerもPythonも初心者な者です。)ユーザーが入力したコードで、標準入力を受け取らせて、出力をさせたいのですが、この場合、Viewsの部分で、標準入力を与えるのでしょうか?ご回答いただけると幸いです。勉強になる記事、ありがとうございました。次のように、stdin引数にファイルを渡すことで、それを標準入力にできます。manage.pyと同じ階層にtest.txtがあります。)幾つかの方法で、ブログの更新を受け取れます。