【Python】Bottleとajaxでデータのアップロード処理を実装する

Ajaxによるデータ送信

最近業務でajaxについて調べていたのですが、古い情報がわんさか出てきていろいろと惑わされ苦労したので、保存用にまとめておきます。

$('#export_btn').on('click', function(event){
    // 通常のアクションをキャンセルする
    event.preventDefault();
        var import_data=new FormData(this);
            import_data.append('filedata', $('input[type=file]')[0].files[0]);
            import_data.append('filename', $('#filename').val());
$.ajax({
    url: '/data/import_csv', // Formのアクションを取得して指定する
    type: 'post', // Formのメソッドを取得して指定する
    data: import_data,
    contentType: false,
    processData: false,
        }).done(function (res) {

関数のイベントはクリックでもSUBMITでもどっちを指定してもいいです。buttonは何も指定していないと自動でSUBMITになるので、event.preventDefault();でSUBMIT処理を無効化しておかないと通信がうまくいきません。

・テキストデータを送るとき

// 通常のアクションをキャンセルする
event.preventDefault();
    var $form= $('#export_form');
    var query= $form.serialize();
    var flag = 0;
    var form2 = document.forms.export;
    var start_date = toDate(form2.start.value, '/');
    var end_date = toDate(form2.end.value, '/');


// 入力必須項目が入力されているかチェック、不適切な場合は各エラーコードとそれに対応したエラーメッセージを返す
//入力日時が出力日時よりもあとならばエラー2を返す
if (end_date.getTime() < start_date.getTime()) {
    flag = 2;
    }

//入力日時と出力日時が90日以上離れている場合はエラーログ3を返す
if (((end_date.getTime() - start_date.getTime()) / 86400000) >= 90) {
    flag = 3;
    }


//入力フォームに空欄がある場合はエラーログ1を返す
if (document.export.start.value == "") {
    flag = 1;
    }

if (document.export.end.value == "") {
    flag = 1;
    }

if (document.export.choise_pattern.value == "") {
    flag = 1;
    }

if (flag == 1) { // 入力必須項目に未入力があった場合
    window.alert('必須項目は全て入力して下さい。'); // アラートを表示
    return false; // 送信中止
    }

if (flag == 2) { // 入力必須項目に未入力があった場合
    window.alert('エクスポート期間の指定が不適切です。もう一度確認してください'); // アラートを表示
    return false; // 送信中止
    }

if (flag == 3) { // 入力必須項目に未入力があった場合
    window.alert('エクスポート期間が90日以上になっています。'); // アラートを表示
    return false; // 送信中止
    } else { // 入力必須項目が全て入力済みだった場合
            $.ajax({
                    url: '/data/export_csv', // Formのアクションを取得して指定する
                    type: 'get', // Formのメソッドを取得して指定する
                    data: $form.serializeArray(), // データにFormがserialzeした結果を入れる
                    }).done(function(response){
                                                window.location.href = "/export_action?path="+response;
                                               }).fail(function(){
                                                                  console.log(query);
                                                                  });}
                                                                });
</script>

テキストデータの送信

serialize()で直列化する必要があります。うまくいかないときはserializeArray()を試してみるのもありかもしれません

画像とかZIPを送るとき

ajaxで画像やファイル系のものをアップロードする通信を実装するにあたっての肝はFormDataをあらかじめ作ってあげる必要があるという点ですね。

テキストデータを送信する場合は必要ないのですが、ファイル形式のものをAJAXを通してアップロードするとなるとこのようにする必要があります。

AJAXでのファイル送信は基本的にこのFORMDATAにアップロードしたいファイルをappendしてオブジェクト方式で送信するという流れになります。

あとtypeはpostにしておかないとだめでGETではちゃんとデータが送れないので注意してください。そして、引数のcontentType: false,とprocessData: false,も忘れないでください。つけておかないと上手く送信できません。

サーバー側での受け取り方は普通の通信の時と同じです。(少なくともBottleとFLASKはそうでした).done以降には通信に成功した際の処理を記述していきます。このコードだとresの部分にサーバー側からのレスポンスが帰ってきています。

ストリーミングでファイルをダウンロードする的な処理はできないので、AJAX通信でダウンロード用URLを返して、.done以降の処理でwindow.location.href =なんかでそのURLにアクセスして発火させるという感じの処理になります。

プログラミングの独学はとても難しい


プログラミングは小学校の義務教育にも導入され始めており、これから社会人として生きていく上でプログラミングはもはや出来て当たり前、出来なれば論外というエクセルレベルの必須スキルになりつつあります。そしてそういう話を聞いて参考書なりを購入して独学でプログラミング勉強しようと思っている人も少なくないでしょう。しかしプログラミングを独学で勉強し始めようと思うものの



・「分からない箇所で詰まって挫折してしまった」

・「勉強する時間が足りない」

・「ネットの記事だと情報が断片的でよくわからない」

・「コードのエラーの原因が分からない」



という壁にぶち当たって、プログラミングの勉強を止めてしまう方が少なくありません。独学でプログラミングを勉強してる時間のほとんどはつまづいている時間です。実際僕も最初のころ独学でプログラミングを勉強していた頃はエラーの原因が分からず丸1日を不意にしてしまった・・・そんな苦い経験がありました。それで僕は一度はプログラミングの学習を諦めてしまいましたが、就活で現実を知る中で



「プログラミングを勉強して、いずれフリーランスとして自由な生き方がしたい」

「エンジニアとして若いうちから高収入を得たい」



という強い気持ちから一念発起して「侍エンジニアのwebサービスコース」に申し込み、プロのエンジニアの方に対面でマンツーマンでPythonによるWebサービス作り方とWeb技術の基本を教えてもらい、ようやくプログラミングが理解でき、今ではエンジニアとしてそこそこの暮らしができるようになりました。





侍エンジニアでは、とりあえずプログラミングやインターネットの基本を知っておきたい人から、HTML・cssなどでWebサイトやWebアプリを作ってみたい人やPythonを勉強してデータサイエンティストやAIエンジニアになりたい人まで幅広いニーズに応えた様々なコースが用意されています。



IT業界と言ってもエンジニアの仕事はプログラミング言語次第でサーバーから機械学習・ディープラーニングまで多種多様ですし、侍エンジニアの無料レッスン(カウンセリング)を受けてみて、自分のやりたいITの仕事は何なのか?を見つけるのがエンジニアへの第一歩になります。ちなみに今侍エンジニアの無料レッスンを受けると1000円分のAmazonギフト券がもらえるので、試しに受けてみるだけもお得です。


自分は半端に独学やオンラインスクールで勉強して金と時間を無駄にするくらいなら、リアルのプログラミングスクールに通ってしっかりプログラミングを勉強した方がいいと思います。ちなみに今、侍エンジニアに申し込むと、25歳以下の学生の方であれば、受講料が20%OFFになるので超お得です。


そして、プログラミングは大勢で授業を受けたり漫然とオンライン学習をするよりも自分が分からない箇所をピンポイントでプロの講師に直接質問して、ちゃんと納得するというスタイルの方がお金は確かに少し掛かりますが、独学で学ぶよりも絶対にモノになります。


シェアする

  • このエントリーをはてなブックマークに追加

フォローする

   侍エンジニア塾       
侍エンジニアの無料体験レッスンを予約する -->