Conoha WingでFlaskを使う方法

はじめに

FlaskはPythonの軽量Webフレームワークとして人気です。Djangoがフルスタックフレームワークとして有名ですが、ちょっとしたサーバサイド処理をしたい際や、インストールできる環境が限られている場合など、Flaskで十分なことも多いかと思います。
そこで、そこで、高速さで人気のレンタルWebサーバであるConoha WingでFlask環境を構築してみました。

Flaskのインストール方法

Conoha Wingのコマンドラインから、以下のコマンドを打ちます。
Conoha Wingにはあらかじめ、pipがインストールされていて、ユーザーが使うことができます。

pip install flask

なお、pipのバージョン、pythonのバージョンも必要に応じて調べておくと良いでしょう。
それぞれ以下のコマンドで調べられます。

python -V
pip -V

実行までに必要なファイルの編集

アプリのファイル群は、public_htmlの中にappというフォルダを作ってそこに入れます。
index.cgiに最初の処理を任せるよう、.htaccessを編集します。ファイルがない場合は新規に作成します。
なお、このサンプルでは、ルーティングとテンプレート変数の挿入まで行います。

.htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /app/index.cgi/$1 [QSA,L]
<Files ~ "\.py$">
  deny from all
</Files>

index.cgi

パーミッションを755にすること。

#! /opt/alt/python36/bin/python3.6
import cgitb
cgitb.enable()

from wsgiref.handlers import CGIHandler
from flask import Flask
from app import app
from sys import path

path.insert(0, '/public_html/app/')# index.cgiのパス

class ProxyFix(object):
  def __init__(self, app):
      self.app = app
  def __call__(self, environ, start_response):
      environ['SERVER_NAME'] = "wwwNNN.conoha.ne.jp"# ← ホスト名
      environ['SERVER_PORT'] = "NNNN"# ← ポート番号
      environ['REQUEST_METHOD'] = "GET"
      environ['SERVER_PROTOCOL'] = "HTTP/1.1"
      return self.app(environ, start_response)
if __name__ == '__main__':
   app.wsgi_app = ProxyFix(app.wsgi_app)
   CGIHandler().run(app)

なお、下記コードの中の ホスト名「wwwNNN.conoha.ne.jp」、ポート番号「NNNN」は各自の環境に応じて書き換えてください。

Conoha Wingのホスト名、ポート番号の調べ方

コントロールパネルの「サーバー管理」→「SSH」に行くと、表示されます。

app.py

#!/opt/alt/python36/bin/python3.6

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def index():
    name = 'Yamada'
    age = 20
    html = render_template('index.html', name=name, age = age)
    return html

@app.route('/hello')
def hello():
    name = 'Jiro'
    age = 14
    html = render_template('index.html', name=name, age = age)
    return html

@app.route('/thanks')
def thanks():
    return 'Thanks!'

if __name__ == "__main__":
   app.run()

templates/index.html

appフォルダの中に、templatesフォルダを作成し、その中に、テンプレートとなるindex.htmlファイルを作成します。
template「s」の複数形なので、間違えないようにします。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>こんにちは</title>
</head>
<body>
    <h2>名前: {{ name }} </h2>
    <h2>年齢: {{ age }}</h2>
    <p>よろしくお願いします</p>
</body>
</html>

改行コードに注意【重要】

index.cgi、app.pyの改行コードは「LF」にしておきましょう。これは見落としがちですが、大事です。
改行コードがCRLFのままだとエラーが発生します。

VS Codeの場合の改行コード変更方法

画面の右下から「LF」もしくは「CRLF」と表示してあるところをクリック。

画面上に、「LF」と「CRLF」の選択肢が表示されるので、「LF」を選択。

ファイルを保存。

実行

Webブラウザでファイルを置いた場所のURLを開きます。

https://(サーバ名)/index.cgi


index.cgiだけだと、Yamadaが表示されます。index.cgi/hello、index.cgi/thanksでそれぞれ表示がかわります。ルーティングと変数で処理が変わっていることが確認できます。

まとめ

Conoha WingはWordpressに重きを置いたWebページ用のサーバですが、Pythonも動きますし、pipでライブラリのインストールもできます。Pythonはデフォルトではバージョンが3.6ですが、3.8まではインストールされているようです。
今回はとりあえずFlaskを動かす事に重きを置いたので深掘りしていません。また、コードの中身も解説はしていませんが、これはFlaskの解説を読むと良いでしょう。

エラー発生時のチェックリスト

自分がはまったところをチェックリストにします。

  • 改行コードはLFになっていますか?
  • 先頭行の#で書いてある先に、Pythonの実行ファイルがありますか?
  • Content-typeの出力の後に、もう一つ改行を出力していますか?
  • cgiファイルのパーミッションは755ですか?