Personal tools
You are here: Home KtJ's Blog Categories Bottle
« January 2020 »
Su Mo Tu We Th Fr Sa
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
 
Document Actions

Bottle

Up one level

Document Actions

サイトをFreeBSD10+python3.3+Bottleで作り直すメモ(9)-Cookie

by ktj posted at 2015-03-29 15:34 last modified 2015-07-20 13:09

クッキーの設定

クッキーの設定にはresponse.set_cookieを使う。下の例ではpostメソッドで取得したフォームデータをmydomain.comドメイン共通のクッキーとして設定する。デフォルトではクッキーはすぐ消滅するとのことなので変数max_ageを使って期限を一年に設定している。

from bottle import route, run, post, request, response

@post('/set_cookie')
def set_cookie():
  max_age = 3600 * 24 * 365
  cookie = request.forms.getunicode('cookie')
  response.set_cookie('cookie', cookie,
    max_age=max_age, 
    domain='mydomain.com',
    path='/')

クッキーの取得

ブラウザから送られるクッキーの取得はrequest.get_cookieを使う。

from bottle import route, run, request

@route('/get_cookie')
def get_cookie():
  cookie = request.get_cookie('cookie', default='')

サイトをFreeBSD10+python3.3+Bottleで作り直すメモ(10)-ステータスコードとリダイレクト

by ktj posted at 2016-11-04 19:31 last modified 2016-11-04 19:31

サイトを作っていると、

  • 任意のステータスコードを出力したい(例えば「URLからコンテンツを動的に作成するが、URLの書式が不正の時はステータスコード404を出したい」)
  • サイトの構成を大きく変えたいが、旧URLからアクセスできるようリダイレクトを行いたい

といったことをやりたい場合がある。

Bottleでは、abort(ステータスコード, テキスト)redirect(リダイレクト先のURL, ステータスコード)という関数を使うことで上記のことを実現できるようになっている。具体的にはこんな感じ。

from bottle import route, run, abort, redirect

@route('/<filepath:path>')
def abort_and_redirect(filepath):
  if filepath=='404error':
    abort(404, 'Not Found')
  elif filepath=='old/contents':
    redirect('http://somewhere/new/contents', 301)
The URL to Trackback this entry is:
http://www.ktjdragon.com/ktj/ktjs-blog/30b530a430c83092freebsd10-python3-3-bottle4f5c308a76f4305930e130e2-10-30b930c630fc30bf30b930b330fc306830ea30a430ec30af30c8/tbping

FreeBSD11+python3.6+Bottleで作り直すメモ(11)-nginxとuWSGIで公開してみる

by ktj posted at 2018-11-14 19:21 last modified 2018-11-17 11:07

FreeBSDのポリシーが変わって2018年10月いっぱいでFreeBSD 10-Releaseは終了したとのことなのでタイトル変更。

これまではBottleが内蔵していたWebサーバで動作確認を行っていたが性能がいまいちなので実運用するなら適当なWSGIサーバを使ってね、とマニュアルにも書かれているので検討してみる。基本的にはh_kabocha氏によるBottle + uWSGI+ Nginx Quick Tutorialのやり方をそのまま使わせて頂いた。ここではFreeBSD環境特有の箇所のみ記載する。

nginx、uwsgi共にpkgでインストール可能。python3.6の場合はuwsgi-py36というパッケージをインストールすればよいようだ。(uwsgiというパッケージもある)。また、FreeBSDの場合は(他のサーバ系パッケージと同様)必要に応じてサーバを動作させるユーザとグループを作ってくれる(nginxについてはもとから用意されていたwww:wwwを利用、uwsgiについてはuwsgi:uwsgiを作成してくれる)。

uwsgiの設定ファイルのデフォルトは/usr/local/etc/rc.d/uwsgiを見る限り/usr/local/etc/uwsgi/uwsgi.iniなのでそこを編集。socketも特にしていてなければ/tmp/uwsgi.sockになるようだ。

まず、Bottleで動かすサイトのソースコードを開き、先頭に下記のコードを追加する。

from bottle import default_app

そして、末尾の

run(host='IPアドレス', port=ポート番号, debug=True, reloader=True)

を、以下のように変更する。

if __name__ == '__main__':
  run(host='IPアドレス', port=ポート番号, debug=True, reloader=True)
else:
  application = default_app()

(2018/11/17追記)正式公開まではバグフィックスの為にソースの先頭にfrom bottle import debugを追加し、application = default_app()の前にdebug(mode=True)を入れてデバッグモードにしておいた方がよさそう。これが無いとpythonコードのエラーがすべて"Internal Server Error"になってしまって原因が特定できない。(追記終わり)

次に、/usr/local/etc/uwsgi/uwsgi.iniを作成する。単純に下記のようにした。

[uwsgi]
chdir = アプリのコードが保存されているディレクトリ
file = アプリのファイル名

続いて、/usr/local/etc/nginx/nginx.confを編集。まず、httpセクションの中に下記を追加する。

upstream _bottle {
    server unix:/tmp/uwsgi.sock;
}

そして、http→server→location / セクションを以下のように変更する。

location / {
    include uwsgi_params;
    uwsgi_pass _bottle;
}

最後に、/etc/rc.confnginx_enable="YES"uwsgi_enable="YES"を追加してuwsgiとnginxを起動すれば完了。

複数のBottleアプリを使いたい場合(例えばコンテンツ表示用のものとコンテンツ編集用のものを別のポートで動かしたい時)は、uWSGIのエンペラーモードを利用する。FreeBSDの場合は/etc/rc.confuwsgi_emperor="YES"を追加する。各アプリのiniファイルは/usr/local/etc/uwsgi/vassals/に移し、socket=/tmp/ソケット名.sockという行を追加する。ソケット名はアプリ毎に違うものを用意する。で、/usr/local/etc/uwsgi/uwsgi.iniは、wapa5pow氏のApacheにかわるwebサーバ: uWSGIパフォーマンスチューニングという記事を参考に以下のようにしてみた(なお、uwsgi自体は、エンペラーモードならuwsgi.iniが無くてもFreeBSDが適当なパラメータを設定してくれる)。また、環境変数LANGを正しく設定していないとSimpleTemplateの起動でこけるのでこれも設定。

[uwsgi]
max-requests = 6000
max-requests-delta = 300
env = LANG=ja_JP.UTF-8

さらに/usr/local/etc/nginx/nginx.confの方はupstreamセクションとserverセクションをソケット毎に用意する。

The URL to Trackback this entry is:
http://www.ktjdragon.com/ktj/ktjs-blog/freebsd11-python3-6-bottle4f5c308a76f4305930e130e2-11-nginx3068uwsgi516c958b30573066307f308b/tbping

Powered by Plone CMS, the Open Source Content Management System

This site conforms to the following standards: