Frozen-Flask タグの一覧です(2 件)

Frozen-Flask で build 後にHTTPサーバを実行させる

Frozen-Flaskで静的ファイルの生成を実施する場合、このようなスクリプトファイルを作って実行します

# freeze.py
from flask_frozen import Freezer
from app import app

freezer = Freezer(app)

if __name__ == '__main__':
    freezer.freeze()
実行するとbuildというフォルダが作成され、静的ファイル群はその中に生成されます。本番サーバにデプロイする場合は、build内のファイル郡をドキュメントルート等にアップロードします。
デプロイする前に生成された静的ファイルを確認する場合、今までは

$ cd build
$ python -m http.server
などとしていたのですが、freezer.run() を使えば、ビルド後にHTTPサーバ(実態はwerkzeugだと思う)が起動されることがドキュメントに書いてありました。

Frozen-Flask — Frozen-Flask 0.12 documentation

なので今は、引数なしfreeze.pyでビルド、 引数run付きで ビルド後にHTTPサーバ起動というようにしています。

import sys
from flask_frozen import Freezer
from app import app

freezer = Freezer(app)

if __name__ == '__main__':
    if len(sys.argv) > 1 and sys.argv[1] == "run":
        freezer.run(debug=True)
    else:
        freezer.freeze()

CMSやブログ的にFlaskを使っているならば、Frozen-Flaskはオススメです。また、静的サイトジェネレーター的に使う場合は下記サイトが参考になります。

Dead easy yet powerful static website generator with Flask | Code | Nicolas Perriault

Frozen-Flask + wercker + Amazon S3 でFlask製ブログを静的サイトとして運用してみた

そんなに大それた話ではないのですが、数日前にFrozen-Flaskを使ってFlask製ブログを文字通りFrozenさせてAmazon S3にホスティングさせてみました。なんとかうまくいっているので暫くこれでやってみます。


Frozen-Flaskを使おうと思った経緯


以前、Flaskの作者Arminさんがこのように言っていたのですが、自分の中でFlaskは mod_wsgi や uWSGI、Gunicorn などと組み合わせて使うもので、当初、Frozen-Flask が必要となる場面をなかなか想像出来ませんでした。
ただその後、WordPressで作成していた旧ブログのホスティングで悩んでいた時にStaticPressを試してみたことがあり、ブログやCMSならば、静的サイト構築もありなんだなと思った経緯があります。

今回Frozen-Flaskを使おうと思ったのは

  • Shizuoka.py界隈でWordPressからPelicanへ移行した方がいて、静的サイトもいいなあと思い始めていた
  • 常々VPS(さくらのVPS 2G)のランニングコストをもう少し節約しようと思っていた

という理由からだったのですが、静的サイトジェネレータへ引っ越すのではなく、4年近く使っているこのブログは生かしたいなと。ならばFrozen-Flaskやってみるかという流れです

あと、Amazon S3を選んだのはコストダウンとwerckerとの組み合わせ事例が幾つかあって導入しやすかったからです。
それとwerckerの導入(静的ファイルのビルドとAmazon S3 へのデプロイ)なのですが、割とすんなり出来たのでローカルでブログエントリーを書いてリモートリポジトリにPushすればデプロイまでやってくれる状態までもっていけました。werckerスゲー便利です。


Frozen-Flaskの運用方法

実際の運用なのですが、現状はこのように使っています。

  1. OS X Yosemite の virtualenv(Python3.4)環境で $python app.py でブログ起動
  2. エントリーを書いて コミットし、BitbucketのプライベートリポジトリへPush(sqliteのDBファイルも含みます)
  3. werckerがフックを感知して、リポジトリをclone
  4. werckerがwercker.ymlの記述通りに環境構築(virtualenvやpip install -r requirements.txtなど)
  5. werckerが$python freeze.py して静的ファイルをビルド
  6. werckerが出来上がった build/ の中身をAmazon S3へsyncする

もうFlask製ブログはローカルエディタみたいなものですね。後は全てwercker任せです。
因みに構成はこの時からほとんど変更ありません
[Python][Flask][Sqlalchemy]blogを作りなおしてみた | aoshiman.org

また、wercker.ymlの中身はこんな感じです。boxはwerckerが用意している標準のものです

box: wercker/python
# Build definition
build:
  # The steps that will be executed on build
  steps:
    # Use this virtualenv step for python 3.3
    - virtualenv:
        name: setup virtual environment
        python_location: /usr/bin/python3.3

    # A step that executes `pip install` command
    - pip-install:
        requirements_file: "requirements.txt" # Optional argument.

    # A custom script step, name value is used in the UI
    # and the code value contains the command that get executed
    - script:
        name: make html files
        code: |
            python freeze.py
# Deploy definition
deploy:
  steps:
      - s3sync:
          key_id: $KEY
          key_secret: $SECRET
          bucket_url: $URL
          source_dir: build/


Frozen-Flaskでつまずいた箇所

  • URLルールをtrailing slash付きに変更
    Frozen-Flask は app.route("/hoge" ) のようなるルールの場合、 hoge というHTMLファイルを作り、 app.route("/hoge/") のような場合、hogeというディレクトリを作り、中に index.html を作ります。
    Flaskで動的に動かしていた時は前者のようなtrailing slash無しのURLルールだったのですが、Pagenateを構築している関係か、Frozen-Flaskでのビルドが途中で止まって上手く行かず。
    色々調べてみたのですが、結局、trailing slashを付けたほうが手数を掛けずにビルド出来るので、URLルールをすべてtrailing slash付きに変更しました。 現在このブログのURLで検索エンジンにインディクスされていたり、ブックマークされているのはtrailing slash無しが多いのですが、適切にリダイレクトされるので、はてなブックマーク等のURLが分かれてしまうところは残念ですが、それ以外は問題ないです。

  • errorhandler() デコレーターは無視される
    ルーティングでのエラー処理で、ドキュメントに書いてあるerrorhandler()デコレータを使っているのですが、 これがFrozen-Flaskでは無視されます。なので別途静的ファイル作成用View関数を用意しました。 こんな感じのやつです

    @app.route('/404.html')
    def error404():
        """function of 404 error handler for frozen"""
        return render_template('404.html')
    

  • Flask-DebugToolbarは外しておく
    Deboug-Toolbarが有効な状態でfreezeさせるとエラーで止まってしまいました。今は必要ないので外しました

残処理について

  • Message Flashingを使って時間経過を表示させているのですが、サーバサイドで処理しているので、ビルドした時間での経過表示で静的ファイルが構築されてしまいます。さすがに毎日ビルドしなおすわけにはいかないので、クライアントサイドで経過表示出来るようにしたいです。
    4月4日 timeago.js をベースにローカライズ含め時間経過を再実装しました。
  • もう少し詳しいFrozen-Flaskについてのエントリー書きます。。

PAGE TOP