OdooのSSLアクセス

odooのconfファイルのproxy_modeと“HTTP_X_FORWARDED_HOST”の値によりプロキシモードかどうかが決められます。
proxy_mode→True、それにHTTP_X_FORWARDED_HOSTの値があれば、werkzeugのproxyfixメソッドが実行される
また、proxyfixメソッドにHTTP_X_FORWARDED_PROTOによりnviron['wsgi.url_scheme']の値が付与されます。

f:id:nobutomo2018:20180330194150p:plain


proxy_mode→TrueにしてもHTTP_X_FORWARDED_HOSTが設定されていないので、狙っているproxyfixメソッドが実行されていない。
結局、werkzeug.utils.redirect処理を行った時に非プロキシモード処理となるので、HTTP遷移が発生しております。


解決方法:def application(environ, start_response)関数の最初に以下の処理を加える
environ[HTTP_X_FORWARDED_HOST]→URL

environ[HTTP_X_FORWARDED_PROTO]→’HTTPS

pythonのmultiprocessing処理

プロセスベースの並列処理(pythondjango環境)

ファイルダウンロードの場合、

  • A処理は、ラッパーページを出す;
  • B処理はファイルの状態を監視する(ダウンロード可能となるとリンクを出す)

このように書くと、メソッドAが別途で実行されます。
p = Process(target=メソッドA, args=(引数1, 引数2,))
p.start()

 

Bのほうは、jqueryajax)を利用して、繰り返して監視する

HTML
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
    <script type="text/javascript">
    window.onload=showPro;
    var bar = 1;
    var my_time;
    var file_name = "{{filename}}";
    var flg;
    function showPro(){
        var pro = document.getElementById("div2");
        pro.style.width = bar+"px";
        bar = bar+5;
        my_time = setTimeout("showPro()",500);
        $("p").hide();
    $.ajax({
        url: "/download_file/",
        type: "POST",
        data: null,
        success: function (data) {
            data = JSON.parse(data);
            if (data["flg"] == 1) {
                pro.style.width = '100%';
       clearTimeout(my_time);
                $("p").show();
            }
        }
    });
    }
    </script>

 

Forkは以下のように有効ですが、Windows環境で使えないのは残念
new_pid = os.fork()
if new_pid == 0:
  return output_html(request, filepath)
else:
  その他の処理

Elasticスクロール処理

通常時に、大量データを検索する時、全てのデータを取り込んでから、検索条件と一致するものを出すこととなります。

なので、Elasticsearch Scroll APIを利用して、ページごとのデータを取り出す。

 

流れとしては、以下のようです。

1,一回目の実行でスクロールIDを取得

POST  http://localhost:9200/インデックス名/_search?scroll=2m

{"size": 100,   1ページの出力件数
    "query": {      
        "bool": {      
  何らかの絞り条件    
        }        
    }        
}        

最後の2mは、2分間保持という意味

 

 

2,二回目以降は、前回のIDを使って検索

POST  http://localhost:9200/_search/scroll 

{"scroll":"2m","scroll_id" : "すごく長い文字列"
}        

ループ処理が要るので、以下が参考となります。 https://gist.github.com/drorata/146ce50807d16fd4a6aa