Help us understand the problem. What is going on with this article?

FlaskでPCとモバイルでテンプレートディレクトリを自動で切り替えるやつ

More than 5 years have passed since last update.

要件

UserAgentでPCかスマホかとか判断して、テンプレートのルートディレクトリが勝手に切り替わってほしい。

例えば、こんな感じでテンプレート用意しといて、

template/ja/pc/index.html
template/ja/sp/index.html
template/ja/fp/index.html

viewでは特にデバイス意識せずにこうしたい。pcを見るかspを見るかとかは自動でやってほしい。

return render_template('index.html', form=form)

みんなどうやってるの?

Flaskのスニペットとか探したけど、一般的な解法が見つからなかった。あったら教えてください。

Flask-Mobility というExtensionがあったけど、これはデコレータをいちいちつけなければならなくてちょっとつらい。それがPythonの流儀と言われたら、まあ、そうなのかな、と思うけど……。
あとは、PC、スマホ、ガラケーとか3つ以上分けるのとかできなさそう。
http://flask-mobility.readthedocs.org/en/latest/

作ってみた

こういうのあったらいいなってのをFlask Extensionにしてみた。
っていうか作ったの1年前だけど。

Python2系と3系どっちでもいけます。

https://github.com/yasunori/flask-devices

インストールはpipで入ります。

pip install Flask-Devices

こんな感じで、任意のデバイスグループ名, UserAgentの正規表現, 対応するテンプレートディレクトリ を定義できます。

devices = Devices(app)
devices.add_pattern('mobile', 'iPhone|iPod|Android.*Mobile|Windows.*Phone|dream|blackberry|CUPCAKE|webOS|incognito|webmate', 'templates/sp')
devices.add_pattern('tablet', 'iPad|Android', 'templates/pc')
devices.add_pattern('hoge', 'hoge', 'templates/hoge')
devices.add_pattern('pc', '.*', 'templates/pc')

これを一度定義するだけで、あとは勝手にやってくれます。
どのデバイスにマッチするかは、上から順に評価します。

あとは、Viewやテンプレート上で、デバイス名を取れるのでなんか処理変えるときにも使えるよ。

@app.route("/", methods=['GET', 'POST'])
def index():
    print(request.DEVICE) # mobile, tablet, hoge, pc
    if request.DEVICE == 'pc':
        # pc
    elif request.DEVICE == 'tablet':
        # tablet
{% if request.DEVICE == 'mobile' %}<strong>今モバイルだよ。<a href="">PC版を見たいのん?</a></strong>{% endif %}

まあまあ個人的には便利に使っています。

注意点としては、uWSGI Emperorとかから使うときはテンプレートディレクトリは絶対パスで指定しないとダメかも。

おしまい。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした