とーますメモ

Ruby on Rails / Goなどの学習メモ

【Python】Flaskの本番環境について調べてみた

Flaskにはbuilt-inサーバがついているので、開発には全く困らないが
公式サイトを見ると以下のように記述があるので、本番環境は別に構築する必要がある。

While lightweight and easy to use, Flask’s built-in server is not suitable for production as it doesn’t scale well and by default serves only one request at a time.

by Deployment Options — Flask Documentation (1.1.x)

調べてみたが大体の本番環境構成は以下。

1)Flask + nginx + uWSGI
2)Flask + nginx + Gunicorn
3)Flask + Apache + mod_wsgi

自分の用途はとりあえずそれなりの本番環境が簡単に作れれば良いぐらいの考えなので
Flask + nginx + Gunicornの構成が一番簡単で良さげ。

参照した記事は以下
Which WSGI server should I use? — Django deployment
https://www.airpair.com/python/posts/python-servers
Web Applications & Frameworks — The Hitchhiker's Guide to Python
fcgi vs. gunicorn vs. uWSGI - Peterbe.com
Gunicorn vs uWSGI | What are the differences?

中でも以下の説明がわかりやすくてよかった。

Gunicorn and uWSGI Gunicorn and uWSGI are two different application servers.
Gunicorn 'Green Unicorn' is a Python WSGI HTTP Server for UNIX. It is very simple to configure, compatible with many web frameworks and its fairly speedy. This article by digitalocean shows how to configure gunicorn with nginx.


uWSGI is another option for an application server. uWSGI is a high performance and a powerful WSGI server. There are many configuration options available with uWSGI. This article by digitalocean shows how to configure uWSGI with nginx.


What I use I use Nginx because it is fast , light and I find the configuration to be much easy. Gunicorn is very simple to configure. So I use gunicorn. uWsgi is also used a lot instead of gunicorn.

一番高いパフォーマンスを目指すならuWSGIが良いけど、ただ設定が複雑。
それなりにちゃんと動作し、それなりに速く、設定がシンプルにものを選ぶならGunicorn。
他の記事を見るとWindowsサーバだとApache + mod_wsgiの一択っぽい。

ということで自分は上記の理由から「Flask + nginx + Gunicorn」の構成を選択する。

設定の仕方については以下のサイトを後ほど参考にする
https://medium.com/faun/deploy-flask-app-with-nginx-using-gunicorn-7fda4f50066a
https://martin-thoma.com/flask-gunicorn/

[その他参考]
・Flask + nginx + uWSGIについて
https://www.digitalocean.com/community/tutorials/how-to-serve-flask-applications-with-uswgi-and-nginx-on-ubuntu-18-04
https://medium.com/@smirnov.am/running-flask-in-production-with-docker-1932c88f14d0
https://www.serverlab.ca/tutorials/containers/kubernetes/how-to-run-flask-docker-containers-in-kubernetes/

・Flask + nginx + Gunicornについて
https://www.toptal.com/flask/flask-production-recipes
https://www.linode.com/docs/development/python/flask-and-gunicorn-on-ubuntu/
https://blog.miguelgrinberg.com/post/running-a-flask-application-as-a-service-with-systemd
https://superset.incubator.apache.org/installation.html#a-proper-wsgi-http-server

【Vue.js】v-forの配列を削除すると、最後の行が消される問題

v-forで配列内をループで回して、表示させており
その中で以下のように、削除を行う機能を実装したのだが
削除すると選択した行が消されず、最後の行が消されるという変な現象が発生した。

[HTML]

<tbody>
  <tr
    is="sample-component"
    v-for="(item, index) in items"
    v-bind:index="index"
    v-bind:item="item"
    :key="index"
    v-on:remove="remove_item"
  ></tr>
</tbody>

[JS]

this.items.splice(index, 1);

原因を調べてみると、「:key」属性に「index」を設定していたのが原因だった。

In scenarios like this the most common problem is the v-for item keys. Your are keying each item by the index, but the index of each item is not constant because items can be removed from the list. Try using unique keys that are associated with item in the list.

by V-for and deleting components - Get Help - Vue Forum

なので設定する:keyをコンポーネントに属する唯一の値にすることで問題が解消された。
v-forのkeyにはindexを設定してはいけません!

[解決済みコード]

<tbody>
  <tr
    is="sample-component"
    v-for="(item, index) in items"
    v-bind:index="index"
    v-bind:item="item"
    :key="item.id"
    v-on:remove="remove_item"
  ></tr>
</tbody>

【Vue.js】v-forの配列を削除すると、最後の行が消される問題

v-forで配列内をループで回して、表示させており
その中で以下のように、削除を行う機能を実装したのだが
削除すると選択した行が消されず、最後の行が消されるという変な現象が発生した。

[HTML]

<tbody>
  <tr
    is="sample-component"
    v-for="(item, index) in items"
    v-bind:index="index"
    v-bind:item="item"
    :key="index"
    v-on:remove="remove_item"
  ></tr>
</tbody>

[JS]

this.items.splice(index, 1);

原因を調べてみると、「:key」属性に「index」を設定していたのが原因だった。

In scenarios like this the most common problem is the v-for item keys. Your are keying each item by the index, but the index of each item is not constant because items can be removed from the list. Try using unique keys that are associated with item in the list.

by V-for and deleting components - Get Help - Vue Forum

なので設定する:keyをコンポーネントに属する唯一の値にすることで問題が解消された。
v-forのkeyにはindexを設定してはいけません!

[解決済みコード]

<tbody>
  <tr
    is="sample-component"
    v-for="(item, index) in items"
    v-bind:index="index"
    v-bind:item="item"
    :key="item.id"
    v-on:remove="remove_item"
  ></tr>
</tbody>

【Vue.js】v-forの配列を削除すると、最後だけが消されていく問題

v-forで配列内をループで回して、表示させており
その中で以下のように、削除を行う機能を実装したのだが
削除すると選択した行が消されず、最後の行が消されるという変な現象が発生した。

[HTML]

<tbody>
  <tr
    is="sample-component"
    v-for="(item, index) in items"
    v-bind:index="index"
    v-bind:item="item"
    :key="index"
    v-on:remove="remove_item"
  ></tr>
</tbody>

[JS]

this.items.splice(index, 1);

原因を調べてみると、「:key」属性に「index」を設定していたのが原因だった。

In scenarios like this the most common problem is the v-for item keys. Your are keying each item by the index, but the index of each item is not constant because items can be removed from the list. Try using unique keys that are associated with item in the list.

by V-for and deleting components - Get Help - Vue Forum

なので設定する:keyをコンポーネントに属する唯一の値にすることで問題が解消された。
v-forのkeyにはindexを設定してはいけません!

[解決済みコード]

<tbody>
  <tr
    is="sample-component"
    v-for="(item, index) in items"
    v-bind:index="index"
    v-bind:item="item"
    :key="item.id"
    v-on:remove="remove_item"
  ></tr>
</tbody>

【MacOS:Catalina】"default interactive shell is now zsh" を非表示にする方法

とりあえずはbashを継続して使用したいのにターミナルを開くたびに、タイトルのメッセージが表示されるのは鬱陶しいので情報を探したところ以下の記事がヒット。

www.addictivetips.com

単純に以下を「.bash_profile」に書けばOK

export BASH_SILENCE_DEPRECATION_WARNING=1

またzshに変更したくなれば以下のコマンドを叩けばOK

chsh -s /bin/zsh

【Rails】migrationファイル実行時に同時にSQLを実行する方法

作成するmigrationファイルの処理は、1つのカラムを追加するというシンプルな処理のみを行う。
しかしdefault値は設定せず、全レコード上の作成されるカラムには、特定の値を埋め込みたいという要件があったため
migration実行時にカラムを追加後、その特定値を埋め込む処理も同時に入れたくなった。

以下のページが参考になった。
qiita.com

class ChangeTests < ActiveRecord::Migration
  def change
    add_column :sample_tables, :test_column, :string, :after => :previous_column

    begin
      ActiveRecord::Base.connection.execute("START TRANSACTION")

      ActiveRecord::Base.connection.execute("
        UPDATE
          sample_tables
        SET
          new_column = 'default_value'
        WHERE
          new_column IS NULL;
      ")

      ActiveRecord::Base.connection.execute("COMMIT")
    rescue => e
      ActiveRecord::Base.connection.execute("ROLLBACK")
      raise "Error: #{e.to_s}"
    end
  end
end

【MySQL】フランス語などのアクセントが正しく取得できない。

以下が参考になった。

mysql – selectクエリを使用してアクセント記号のない文字でカラムをフィルタリングする方法 - コードログ
utf 8 - How to conduct an Accent Sensitive search in MySql - Stack Overflow

以下のように「COLLATE utf8_bin」を付ければ良い。

WHERE col_name = 'abád' COLLATE utf8_bin