2016-11-19 3 views
0

データベースのバックエンドとしてSQLiteでDjango 1.10を使用しています。 私はnginx/uwsgiと上記の設定で動作しているサイトを持っています。これは常に新しいコードで更新しています。Django/SQLite:誰かがdb.sqlite3をチェックして*現在*ログインしているかどうかを確認する方法はありますか?

私はサイトコードを更新するたびにuwsgi、nginx、git pullをレポから新しいバージョンに移行してから、uwsgiとnginxを再起動します。

サイトが新しいバージョンのコードで更新されるという意味で、副作用は、ユーザーが現在サイトにログインして何かに取り組んでいる場合に発生します。 dbを変更する結果となる)、ユーザの作業は中断される。

新しいバージョンのコードにマイグレーションが含まれていると、DB構造が変更され、ユーザーの進行中の作業に(予期しない結果が)発生することがあります。

質問:コマンドラインスクリプトのように、db.sqlite3をチェックし、uwsgiとnginxをシャットダウンすることを決定する前に、ユーザーが現在ログインしているかどうかを確認する方法がありますか?

答えて

1

いいえと言います。可能性があります

  • ユーザーはログインしてしばらくログアウトしませんでした。
  • 我々はdjango_sessionテーブルにログアウトをdidntのユーザーでログインして得ることができますログインしますが、

非アクティブ。

1

より良い方法は、ダウンタイムを最小限に抑えることです。まず、コードやuwsgiを更新するときにnginxを再起動する必要はなく、git pullを実行しているコードに影響を与えることなく新しいコードを引き込む前にuwsgiを停止する必要はありません。

移行に関しては、現在実行中のコードを破壊する移行を避けてください。たとえば、現在のコードでまだ使用されているフィールドやモデルは削除しないでください。ただし、次回の更新まで待機してください(フィールド/モデルが使用されなくなったとき)。これにより、エラーを発生させることなく、古いコードを実行している間に移行を実行できます。

次に、手動で停止して開始するのではなく、reload uwsgiの処理を行う必要があります。これにより、プロセスをリロードする前に、開いているリクエストの処理が完了します。また、プロセスがリロードされた直後に処理できるように、新しい要求を待機します。ユーザーは処理速度が低下する可能性がありますが、プロセスが再ロードされる前にキューがいっぱいになっていないと、要求が破棄されることはありません。小規模なウェブサイトの場合、これは決して起こらないはずです。だから、

、あなたのウェブサイトを更新するためにこれを使用することができ、ダウンタイムを回避するために:

$ git pull     # pull in new code while the old process is still running 
$ python manage.py migrate # run your migrations, and possibly `collectstatic` etc. 
$ kill -HUP `cat <pidfile>` # gracefully reload the uwsgi process 
関連する問題