今回は、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
コメント