Conoha WingでFlaskを使ってみた

スポンサーリンク
helloFlask Flask
スポンサーリンク

 今回は、Flaskを使って、Conoha WingのWebサイトに新しいページを作ってみます。Conoha Wingは最初からPython 3.6.9が入っているので、そこに、Flaskを入れて、「Hello World」を表示させてみます。

Flaskのインストール

 「pip install flask」とやってみましたが、しばらくインストーラーが動いたあと、インストールを開始する前にエラーが起きて止まっていました。エラーメッセージを読むと、

  • どうやらサーバーのシステムの方にインストールしようとしてしまったので、ユーザーディレクトリに保存するように「–user」をオプションで使えてpipを実行してほしいとのこと。
  • もう一つはエラーではないが、新しいバージョンのpipがあるからそちらをつかってほしいとのこと。
[cxxxxxxx@web0xxx ~]$ python3 --version
Python 3.9.7
[cxxxxxxx@web0xxx ~]$ pip install flask
.....
Installing collected packages: itsdangerous, dataclasses, Werkzeug, typing-extensions, zipp, importlib-metadata, click, MarkupSafe, Jinja2, flask
Could not install packages due to an EnvironmentError: [Errno 13] Permission denied: '/opt/alt/python36/lib/python3.6/site-packages/itsdangerous'
Consider using the `--user` option or check the permissions.

You are using pip version 10.0.1, however version 21.3.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

 早速、pipの方から、アップグレードしてみます。最後、また、同じメッセージが出たのですが、バージョンを確認したら、ちゃんとアップグレードできていました。また、警告として、「pip」を書くのを避けて、「python -m pip」とちゃんと書いてくださいとお叱りを受けました。すみません、、、次からちゃんと「python – m pip」を使います。。。

[cxxxxxxx@web0xxx ~]$ pip install --upgrade pip --user
Collecting pip
  Using cached https://files.pythonhosted.org/packages/a4/6d/6463d49a933f547439d6b5b98b46af8742cc03ae83543e4d7688c2420f8b/pip-21.3.1-py3-none-any.whl
Installing collected packages: pip
Successfully installed pip-21.3.1
You are using pip version 10.0.1, however version 21.3.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
[cxxxxxxx@web0xxx ~]$ pip --version
WARNING: pip is being invoked by an old script wrapper. This will fail in a future version of pip.
Please see https://github.com/pypa/pip/issues/5599 for advice on fixing the underlying issue.
To avoid this problem you can invoke Python with '-m pip' instead of running pip directly.
pip 21.3.1 from /home/cxxxxxx/.local/lib/python3.6/site-packages/pip (python 3.6)

 「pip install –user」でインストールすると、どうやら、ホームディレクトリの中の「/.local/」の中に保管されるようです。自分で入れたPython 3.9.7は「/local/」の中にライブラリが入るそうなので、微妙に干渉しなくて済みました。

[cxxxxxxx@web0xxx ~]$ python -m site --user-base
/home/c3447473/.local

 さて、随分本題からずれましたが、Flaskをインストールします。

[cxxxxxxx@web0xxx ~]$ python -m pip install --user flask
  Using cached Flask-2.0.3-py3-none-any.whl (95 kB)
Collecting Jinja2>=3.0
  Using cached Jinja2-3.0.3-py3-none-any.whl (133 kB)
....
  Using cached zipp-3.6.0-py3-none-any.whl (5.3 kB)
Installing collected packages: zipp, typing-extensions, MarkupSafe, importlib-metadata, dataclasses, Werkzeug, Jinja2, itsdangerous, click, flask
Successfully installed Jinja2-3.0.3 MarkupSafe-2.0.1 Werkzeug-2.0.3 click-8.0.4 dataclasses-0.8 flask-2.0.3 importlib-metadata-4.8.3 itsdangerous-2.0.1 typing-extensions-4.1.1 zipp-3.6.0

 「pip list」で確認したら、ちゃんとflaskが入っているのがわかりました。

[cxxxxxxx@web0xxx ~]$ python -m pip list
Package            Version
------------------ -------------------
click              8.0.4
dataclasses        0.8
Flask              2.0.3
importlib-metadata 4.8.3
itsdangerous       2.0.1
Jinja2             3.0.3
MarkupSafe         2.0.1
pip                21.3.1
setuptools         38.5.2.post20200320
typing_extensions  4.1.1
Werkzeug           2.0.3
zipp               3.6.0

Flaskページの準備

 まずは、Flaskのページの準備をします。サーバーのpublic_htmlフォルダの中にディレクトリを作ってやります。今回は、以前、Pythonのスクリプト実行用に作った「python/」の中に「flask-test/」というディレクトリを作りました(下のディレクトリ構成)。python/.htaccessにはwebページでPythonファイルを使う設定が入っています。

public_html/
 ┗ [ドメインのディレクトリ]/
   ┗ python/
    ┣ .htaccess
    ┗ flask-test/
     ┣ .htaccess
     ┣ index.cgi
     ┣ app.py

Options +ExecCGI
AddHandler cgi-script .py

  flask-testの下には次のような.htaccessを置いてやります。これにより、flask-testの下のindex.cgiを起点としたflaskのページを作る準備ができました。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /python/flask-test/index.cgi/$1 [QSA,L]

 次にindex.cgiの中身を書いていきます。ここでは、appを呼び出す設定にしています。ここで先頭の#!/usr/local/bin/pythonはお使いのpythonの場所に応じて、変える必要がありますが、conoha wingの場合はusr/local/bin/の中にあります。index.cgiでは、flaskの実行ファイルをcgiとして扱うように記載します。

#!/usr/local/bin/python

from wsgiref.handlers import CGIHandler
from app import app
CGIHandler().run(app)

 続きまして、app.pyを書いていきます。下にapp.pyの各行の詳細説明を示します。

from flask import Flask
 最初に、Flaskのモジュールをインポートします。

app = Flask(name)
 appをwebアプリに設定します。

@app.route(‘/’)
@app.route(‘/hello’)
def hello():
return ‘<h1>Hello World</h1>’
 ここではappのルーティングを行っています。ルートディレクトリ(/)か/helloにアクセスしたとき、hello()関数として、<h1>Hello World</h1>を出力して、画面に「Hello world」と表示します。

@app.route(‘/’)
@app.route(‘/hello’)
def hello():
return ‘<h1>Good bye!</h1>’
 同様に、/goodbyeにアクセスしたときは、<h1>Good bye!</h1>を表示します。

if name == ‘main‘:
app.run(debug=True)
 appを起動します。

from flask import Flask

app = Flask(__name__)

@app.route('/')
@app.route('/hello')
def hello():
    return '<h1>Hello World</h1>'

@app.route('/goodbye')
def bye():
    return '<h1>Good bye!</h1>'

if __name__ == '__main__':
    app.run(debug=True)

 作ったファイルは、ftpなどを使って、サーバーに置いて、ファイルパーミッションの属性設定をします。

.htaccess 644 (rw-r–r-)
index.cgi 700  (rwx——) 
app.py 600  (rw——-)

Flaskの実行結果

 それでは見ていきます。それぞれ、python/flask-test以下にアクセスしてみます。それぞれルートディレクトリかhelloの時は「Hello World」が表示され、goobyeにアクセスした場合は、「Good bye!」が表示されます。また、定義していないディレクトリ(例えば、thankyou)にアクセスしようとすると、「Not Found」を返してくれました。

 ちなみに、今回作成した「Hello World」はこちらのページです。

 今回は、Conoha Wingにflaskで「Hello World」などを表示してみました。Conoha Wingだと、わりと制限なく、flaskを使えそうです。。。

関連ページ

Flaskの日本語ドキュメントのページ
Conoha Wing FAQ
レンタルサーバーでPythonのHello, World

コメント