【Flask】軽量ウェブフレームワークFlaskをローカル環境、サーバー環境(Xserver)で動かす方法[Python]

  • URLをコピーしました!
目次

Flask

前回、Pythonでのmatplotlibのtight_layoutの挙動を確認した結果を紹介しました。

今回はPythonの軽量ウェブフレームワークであるFlaskをローカル環境、サーバー環境で動かす方法を紹介します。

なぜここでFlaskなのかというと、最近、Webアプリ(WebAPI)を作るためにJQueryのAjax、PythonのPyScriptやFastAPIをいじってきたのですが、どうしてもやりたいことまで到達しきれない。

理由は色々あったのですが、現在の私の力量では超えることができなかったので、再度手を変え品を変えということで、Flaskに槍玉が上がったというところです。

ただその際にローカル環境とサーバー環境で動かし方が異なったことから、それをまとめておこうというのが今回の趣旨です。

それでは始めていきましょう。

Flaskのプログラム

まずFlaskで動かすプログラムですが、こんな感じで作成してみました(hello.py)。

#! /pythonのパス/python3

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

FlaskのプログラムはFastAPIのプログラムと似ています(というよりもFastAPIが後発なので、FastAPIがFlaskに似ている?)。

まず「app = Flask(__name__)」としてインスタンス化します。

そして「@app.route(‘/’)」でアクセスするURL(エンドポイント)を設定し、その下の「def文」でその動作を定義します。

今回の場合は「return ‘Hello, World!’」となっているので、「Hello, World!」が返されます。

ローカル環境で動かす場合

それでは先ほどのローカル環境で動かしてみましょう。

ローカルで動かす場合にはFlaskを起動するための別のプログラムが必要になります。

それがこちら(main.py)です。

#! /pythonのパス/python3

import os
from hello import app

if __name__ == '__main__':
  app.run(host=os.getenv('APP_ADDRESS', 'localhost'), port=8000)

まずosモジュールと先ほどのhello.pyのapp関数をインポートしています。

from hello import app

そして「if __name__ == ‘__main__’:」でこのプログラムが実行された時の動作を定義しています。

実行するのは先ほどのhello.pyのapp関数をローカルでサーバーを立てて実行するというコマンドです。

app.run(host=os.getenv('APP_ADDRESS', 'localhost'), port=8000)

これをターミナル上で「python main.py」として実行するとローカルサーバーが起動します。

python main.py

 * Serving Flask app 'hello'
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on http://localhost:8000
Press CTRL+C to quit
127.0.0.1 - - [28/Mar/2023 09:48:21] "GET / HTTP/1.1" 200 -

これで「http://localhost:8000」にアクセスすると「Hello, World!」が表示されます。

これでFlaskをローカル環境で動かすことができました。

サーバー環境(Xserver)で動かす場合

次にサーバー環境(Xserver)で動かしてみましょう。

サーバー環境で動かす場合は、「index.cgi」と「.htaccess」の二つのファイルがさらに必要です。

index.cgiはindex.cgiが配置されているフォルダにアクセスした際にFlaskを起動するプログラムです。

#! /pythonのパス/python3

from wsgiref.handlers import CGIHandler
from hello import app

CGIHandler().run(app)

そして「.htaccess」はWebサーバーの挙動をフォルダ単位で制御するためのファイルだそうです。

書き方としてはこんな感じです。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.cgiのフォルダ/index.cgi/$1 [L]
</IfModule>

ここでの注意点は「/index.cgiのフォルダ/index.cgi/」でindex.cgiが配置されているパスを設定することです。

Xserverの場合、「hello.py」、「index.cgi」、「.htaccess」の3種のファイルをフォルダに入れて、「public_html」以下、どこでもいいので配置します。

配置する際、パーミッションはhello.pyは「604」、index.cgiは「755」、.htaccessは「644」にすることを注意してください。

これで「index.cgiを配置したフォルダ/エンドポイント」にアクセスすると処理が実行されます。

Flaskでmatplotlibを使う方法

ちなみにサーバー環境の場合、いつも通りmatplotlibを使おうとするとInternal Server Error 500が出てしまいます。

(ローカル環境の場合は大丈夫っぽい?)

その場合はまず「index.cgi」に「import os」と「os.environ[‘OPENBLAS_NUM_THREADS’] = “1”」を追加します。

これは並列処理をさせないという設定です。

#! /pythonのパス/python3

from wsgiref.handlers import CGIHandler
from hello import app
import os

os.environ['OPENBLAS_NUM_THREADS'] = "1"

CGIHandler().run(app)

次に「hello.py」でmatplotlibをインポートする場所をdef文内にします。

#! /pythonのパス/python3

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    import matplotlib
    return 'Hello, World!'

これでmatplolib(もしかしたら標準ライブラリ以外ということかもしれません)が使えるようになりました。

次回はJavaScriptで数値と文字列の取り扱いに関して紹介します。

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次