質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3940閲覧

djangoを使ったサーバー上でのpython実行方法について

bullton

総合スコア39

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

0クリップ

投稿2018/11/24 13:03

編集2018/11/24 15:48

現在,djangoを使ったWEBサイトの制作を勉強しております.
https://tutorial.djangogirls.org/ja/
こちらのチュートリアルを参考に,WEBサイトを公開できるまでは進めることができました.
しかしながら,WEBサーバー上でpythonファイルを実行し,その結果に応じてサイトを操作できるような仕組みにする方法が分かりません.

具体的には,サイト上のボタンをクリックするとpythonで書いた音声認識が実行され,その認識結果に基づいてサイトを更新するといったものを作りたいです.
音声認識用のpythonファイルは,音声をwavファイルとして録音する機能と,そのwavファイルを某APIでテキスト化する仕組みになっており,自分で構築しました.

サイトとサイト上のボタンは,HTML,CSS,javascriptを使って記述しました.javascriptからpythonを呼び出すことができれば良いのですが,どうも難しく.
(サーバーに関しては,チュートリアルの案内とおり,python anywhereを使用)

・サーバー上でpythonを実行する方法
・録音したwavファイルをサーバーにアップロードし,pythonファイルに受け渡す方法

以上二点について,現在の知識では解決できそうにないため,ご教示いただけないでしょうか.
宜しくお願い致します.

アドバイスに基づき補足させていただきます.
実務での開発経験はありません.
WEBサーバーの開発経験もこれが初めてです.
言語に関しても独学でpython,javascript,java,c++に軽く触れた程度です.

PolymetisOutis7👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gh640

2018/11/24 14:17

「現在の知識」としてどのような知識をお持ちなのかをご説明されると、有益な回答が得られやすくなると思います。
gh640

2018/11/24 14:20

例えば、 Django 以外でウェブサイト構築の経験はあるのか、プログラミングの経験はどの程度あるのか、 Python の経験はどの程度あるのか、を伝えられると、よりご状況に合ったアドバイスが得られるかと思います。
bullton

2018/11/24 15:48

ありがとうございます.補足しましたので,ご確認いただけたら幸いです.
gh640

2018/11/25 03:46

補足として追記いただいた部分も受けて回答をさせていただきました。ご覧になってみてください。
bullton

2018/11/25 15:33

ご連絡が遅れてしまい大変申し訳ございません。詳しくご記入いただき本当に感謝しております。休日は都合があり確認させていただく事ができなかったのですが、明日から参考にさせていただきながら頑張ってみます!
guest

回答1

0

ベストアンサー

補足として追記いただいた情報を踏まえて回答させていただきます。ソフトウェアのバージョンに言及されていませんが、 Python 3.x 、 Django 2.1.x と仮定してご説明しますね。

・サーバー上でpythonを実行する方法
・録音したwavファイルをサーバーにアップロードし,pythonファイルに受け渡す方法

まずは「pythonを実行する方法」の方からコメントいたします。

・サーバー上でpythonを実行する方法

Django は Python のライブラリ(「パッケージ」)のひとつなので、 Django アプリケーションのデプロイが成功しそれがサーバー上で動いているのであれば、 Python が実行できている、ということになります。

「WEBサイトを公開できるまでは進めることができました」とのことですので、「サーバー上で Python を実行する」というのはすでに達成されていると思います。

ですので後は、「音声認識用のpythonファイル」を Django のリクエスト・レスポンスの処理の流れの中で呼び出す、ということができれば OK 、だと思います。「音声認識用のpythonファイル」が voice_recogition.py という名前だと仮定して以下説明を進めます。

新しいアプリケーションの作成 」のところで python manage.py startapp blog という風にコマンドを実行されると、次のように blog というディレクトリが作られたものと思います( blog は説明のために使っている app 名です。実際に作られた app 名に適宜読み替えてください)。

text

1djangogirls 2├── blog 3│ ├── __init__.py 4│ ├── admin.py 5│ ├── apps.py 6│ ├── migrations 7│ │ └── __init__.py 8│ ├── models.py 9│ ├── tests.py 10│ └── views.py

settings.py 内の INSTALLED_APPSblog app を有効化したら(…の意味がわからなければ、チュートリアルに説明が載っているので確認してみてください)、ディレクトリ blog の中に voice_recogition.py ファイルを置きます:

text

1djangogirls 2├── blog 3│ ├── __init__.py 4│ ├── admin.py 5│ ├── apps.py 6│ ├── migrations 7│ │ └── __init__.py 8│ ├── models.py 9│ ├── tests.py 10│ ├── views.py 11│ └── voice_recogition.py ← これを追加

こうすると、例えば、 blog ディレクトリ内の views.py から voice_recogition.py の中の関数を次のように呼び出し利用することができます。

python

1# blog/views.py: 2from . import voice_recogition 3 4def exec_voice_recognition(request): 5 file = ... 6 result = voice_recogition.recognize(file) 7 ...

他にもさまざまなアプローチがありますが、まずはこの「作った app の中に Python ファイルを置いてそれを呼び出す」ということの達成を目指されるとよいかと思います。

voice_recogition.py ファイルを別の場所に置いたり、複数の app から呼び出せるようにしたりするには、 Python の import の仕組みを理解する必要があります。そのあたりはここでは説明しきれないので、 Python 公式のドキュメントや書籍等を読んで学習してみてください(そのあたりは質問サイトでお聞きになるより書籍等で学ばれる方が近道です)。

・録音したwavファイルをサーバーにアップロードし,pythonファイルに受け渡す方法

いくつか方法がありますが、まずは、通常のフォームと「ファイルフィールド」を使った受け渡しを実現されるのがよいものと思います。この場合は JavaScript でのコーディングは必要ありません。

おおよその流れは次のとおりです。

  1. ファイルを受け取れるフォームクラスを作成する
  2. 1 のフォームクラスを使ってフォームを描画・データを受け取る view を作成する
  3. 1 と 2 に対応するフォームページのテンプレートファイルを作成する
  4. 結果表示のためのページの view とテンプレートファイルを作成する

これがひととおりできれば、「ユーザが該当ページを開く → ファイルのアップロードができるフォームが表示される → ユーザがファイルをアップロードする → サーバー側で音声認識が行われ結果ページが表示される」ということが実現できます。

1 のイメージは次のとおりです。

python

1# blog/forms.py: 2from django import forms 3 4class UploadFileForm(forms.Form): 5 title = forms.CharField(max_length=50) 6 file = forms.FileField()

2 のイメージは次のとおりです。

python

1# blog/views.py: 2from django.http import HttpResponseRedirect 3from django.shortcuts import render 4from .forms import UploadFileForm 5 6 7def upload_file(request): 8 if request.method == 'POST': 9 form = UploadFileForm(request.POST, request.FILES) 10 if form.is_valid(): 11 uploaded_file = request.FILES['file'] 12 # ここで `uploaded_file` に対して音声認識の処理を行う 13 # 音声認識が無事に成功すればリダイレクト先で音声認識の結果を表示する 14 return HttpResponseRedirect('/result/') 15 else: 16 form = UploadFileForm() 17 return render(request, 'upload.html', {'form': form})

3 のイメージは次のとおりです。

python

1<form action="/upload-file-url/" method="post"> 2 {% csrf_token %} 3 {{ form }} 4 <input type="submit" value="送信"> 5</form>

細かく見ていくと、アップロード可能なファイルを .wav ファイルに制限したり、 Django のアップロードファイルサイズの制限を変更したり、ということが必要になってきますが、まずはこのあたりの大筋の部分の実装を試みられるのがよいかと思います。

コード内の変数名等はあくまでもサンプルなので、コピペはされずにあくまでも大まかなタスクとロジックの参考としてお読みください。

また、サイトを production として不特定多数の人に公開する場合には、追加で気をつけるべきポイントがもろもろあります。それはここでは説明しきれないので、公式のドキュメントを読んだり書籍を読んだりしてみていただければと思います。

尚、上のサンプルコードは公式のページのものを一部改変しただけのものです:

ここですべてをご説明するのは大変なのでざっくりとした説明にはなってしまいましたが、ご参考になれば幸いです :)

(「単語の意味がわからない」といったシンプルな疑問点についてはググって解消していただきたいですが、チャレンジしてみたが行き詰まってどうにもならない、といった場合はコメントください)

投稿2018/11/25 03:30

gh640

総合スコア1407

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bullton

2018/11/26 01:13

参考にさせていただいております.本当にご丁寧な回答いただき大変感謝しております. しかしながら,一点だけ伺いたいく. ・録音したwavファイルをサーバーにアップロードし,pythonファイルに受け渡す方法 に関することで,ユーザーがファイルをアップロードするための操作を必要とせずにwavファイルをサーバーにアップロードすることは可能でしょうか. 想定している利用が,音声認識ボタンをクリックした後に,発話するだけでサイトを簡易的に操作できるものであるため,そのような方法を探しておりました. ファイルをアップロードする方法としては,記述いただいたフォームを用意する方法が一般的かと思いますが,何かご存知の方法がありましたら,ご教示いただきたいです. 宜しくお願い致します.
gh640

2018/11/26 01:45

ユーザーがファイルを事前に用意することなく、サイトの UI 内(ブラウザ内)で音声入力できるようにしたい、ということですね。 私は利用した経験がありませんが、 JavaScript の `navigator.MediaDevices.getUserMedia()` というものを使えば、ユーザーがマイクで音声を直接入力できる形にできるようです。 次のコードは Google の Web Fundamentals のページからの引用です: ```js <audio id="player" controls></audio> <script> var player = document.getElementById('player'); var handleSuccess = function(stream) { if (window.URL) { player.src = window.URL.createObjectURL(stream); } else { player.src = stream; } }; navigator.mediaDevices.getUserMedia({ audio: true, video: false }) .then(handleSuccess) </script> ``` - https://developers.google.com/web/fundamentals/media/recording-audio/ 原理的には、上のコードのコールバック `handleSuccess()` の中で `stream` をサーバーに投げるようにして、サーバー( Python )側ではそれを受け取るようにするとよいものと思います。 ただし、対応ブラウザに要注意なのと、ユーザーからの許可を明示的に得る必要がある(ダイアログが出るようです)ので、その点は注意が必要かと思います。 踏み込んだ内容については次のページや等を参照してみてください。 - https://developer.mozilla.org/ja/docs/Web/API/MediaDevices/getUserMedia - https://caniuse.com/#feat=stream
bullton

2018/11/26 01:51

迅速に回答をいただき大変感謝しております. これだと,理想とする動作を実現することができるかと思いますので,調べてみます!
gh640

2018/11/26 01:57

完成するとおもしろそうですね!がんばってください :D
bullton

2018/11/27 08:51

度々の質問を失礼します. 現在,javascriptでの音声録音が完了し,そのデータをサーバー上のpythonに引き渡す方法を模索しております. 通常のformの様なユーザー入力ではなく,javascript上の変数に格納されている音声データをサーバー(python)に引き渡すことはdjangoでは可能でしょうか. 調べているのですが,構成が分からず,質問させていただきました. 宜しくお願い致します.
gh640

2018/11/27 12:43

> djangoでは可能でしょうか. 可能だと思います。 こちらは https://teratail.com/questions/160337 のご質問内容と同様のことをお聞きになっていますか?
bullton

2018/11/28 01:44

ありがとうございます. ほとんど同様です.djangoからリクエストをかけて,javascriptのデータを受け取りたいのですが,どういった方法が適切であるのか未だに掴めず. 可能であれば,アドバイスをいただければと...
gh640

2018/11/28 08:00

「 Ajax 」ということばはご存知ですか? もしご存知でなければ、 JavaScript のデータをサーバに渡すといえば Ajax が定番のアプローチなので、 Ajax についてお調べになってみてください。 Django でも「 Django Ajax 」等のキーワードで検索すればいろいろサンプルが見つかるかと思います。 ちなみに Django で Ajax といえば narito さんのブログ記事がわかりやすいと思います: https://narito.ninja/detail/88/ (目指されていることを Ajax で実現する場合は記事の内容をひととおり理解する必要があると思います。まず記事をお読みになって、できそうかどうか判断してみてください) そうではなくて Ajax についてはすでにご存知でご質問されているのであれば、何をお知りになりたいのかがちょっとわかりません……もう少し言葉を変えてご質問いただければと思います。
bullton

2018/11/30 03:27

ありがとうございます.間が空いてしまい大変申し訳ございません. お気づきかとは思いますが,jsとpy間のデータ受取りのところで少し勘違いをしておりました. せっかく,回答をいただき大変恐縮ですが,質問を改めさせていただきたく. javascriptで取得したユーザーの発話をサーバー上のpythonで扱うための方法として,現在はdjangoのform機能を使おうと考えています. しかし,formの本来の使い方は,入力フォームをHTMLで表示し,そこにキーボード入力されたものを受け取るというようなものであると思います. 今回は,特に入力フォームをブラウザ上で表示する必要はなく,単に音声データを受け取ることができれば問題ありません このような,場合でもformが正しい方法と言えるのか,また別の方法をとった方が適しているのか, これについてご意見を改めて,いただけないでしょうか. どうかお願い致します.
gh640

2018/11/30 08:52

> このような,場合でもformが正しい方法と言えるのか,また別の方法をとった方が適しているのか, > これについてご意見を改めて,いただけないでしょうか. そうですね。端的にだけ回答させていただきますね。 私が実装するなら `Form` クラスは使わない可能性が高いですが、 `Form` クラスを使うことにも一定のメリットはあると思います。どちらがよいかは bullton さんのお持ちの知識等によって変わる気がします。 また、おそらく私が理由を沿えてご説明しても、「それはどういう意味?」「 `Form` クラスの機能は何なの?メリットは何なの?」「 `Form` クラスを使わない実装というのは具体的にどうすればいいの?」と新たな疑問点が次々に湧いていて、ご納得には至らなさそうな気がします。 ですので、もう少しベースのお勉強を進めてから取り組まれるのが近道ではないかと思います。例えば、公式ドキュメントの `Form` クラスに関するページ ↓ を一通り読まれると「 `Form` クラスを使うべきか否か」の疑問はある程度解消するのではないかなと思います。 https://docs.djangoproject.com/en/2.1/topics/forms/ https://docs.djangoproject.com/en/2.1/topics/forms/modelforms/ https://docs.djangoproject.com/en/2.1/ref/forms/ 逆に、これらのページを読んでもピンと来ない場合は、ベースとなる、プログラミングや HTTP や HTML の知識がもう少し必要なのではないかと思います。 そうではなく、もう実装できるだけの知識はあるよという場合は、いったん両方のパターンで実装されてみると実際に良し悪しが実感できると思います。ご参考になさってください :)
bullton

2018/12/02 04:47

ありがとうございます. それでは,一度フォームを使った実装を試みてみようと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問