CORESERVERでFlaskを使ったWebAPIを作ってみる

# 概要
Androidアプリ開発で、Serverから情報を取得して表示するアプリを作った際、なるべく手軽で、安価で・・・
という考えから、CORESERVERでWebAPIを作ってみた。という記事です。

CORESERVERは、単なるHTMLやCGIをアップロードできる領域というものではなく、Python3やMySQLも使えるので、Flaskで簡易的に作っています。

https://play.google.com/store/apps/details?id=com.sekai.tsukuru.app.quickmatome&hl=ja


# 基本的な話

## CORESERVERとは
■ CORESERVER（https://www.coreserver.jp/ ）

ざっくり言えば、コスパ最強の「レンタルサーバー」です。
V1プランで「**CORE-Mini**」を選択すれば、年払いで**2,640円**（1日 7円！）にて使えるという驚き。

→料金表（V1の方をみてね）
https://www.coreserver.jp/price/

しかも、月間の転送量MAXは「無制限」（当然、制限はしないけど、負荷上がったらそれまで。という方式）。
MySQLだろうが、Python3だろうが、かなりいろいろ使えるけど金額変わらず。
素晴らしい！
**実験台としては、申し分ない・・・・**

※なお、CRONも使えるので、自動実行なども可能！（ただし、制限はある）
※さらに、無料SSLも使える！（ひゃっほい）


## Flaskとは
■ Flask（https://flask.palletsprojects.com/en/2.0.x/ ）

簡単にいえば、WebAPIで「 https://hogehoge.com/ 」と「https://hogehoge.com/hello 」を下記コードで作れるということです。

なので、Python3の便利な機能をFlaskで思う存分使いまくれる。ということです。

```
from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'Index Page'

@app.route('/hello')
def hello():
    return 'Hello, World'
```

# 実際にやってみる
前提としては、下記ぐらいを想定してます。

* Windows10を利用
* CORESERVERのアカウントは作成済
* Python3はなんとなく知ってる
* Linuxコマンドはなんとなく使える

## 【準備１】CORESERVERへの接続確認

### CORESERVERへ接続する（WinSCP編）
■ WinSCP（ https://ja.osdn.net/projects/winscp/ ）

この辺を見ながら、ログインします。

・FTPソフトの設定情報の確認
https://help.coreserver.jp/manual/ftp-info/
・WinSCPの設定方法（FTPSプロトコル）
https://help.coreserver.jp/manual/winscp/

### CORESERVERへ接続する（TeraTerm編）
■ TeraTerm （ https://ja.osdn.net/projects/ttssh2/ ）

この辺を見ながら、ログインします。

・SSHの利用（Windows）
https://help.coreserver.jp/manual/v1/ssh-win/

## 【準備２】インストール済のパッケージを確認する（Python3）

TeraTermによるログイン状態から、インストール済みのパッケージを確認します。
（すでに、自分で色々入れているので多々増えてます）

```
[hoge@xx2 ~]$ python3 -m pip freeze
certifi==2021.10.8
・・・
```

:::note warn
注意
下記で確認すると、「Python2」のものが表示されてしまいます。

```
[hoge@xx2 ~]$ pip freeze
```
:::

## 【準備３】Pythonファイルを作成する

* 全部のアクセスをすべて「index.py」に向けちゃうぞ！というリダイレクト処理とCGIモードで動かします。の宣言
```.htaccess
AddHandler cgi-script .py
 
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.py/$1 [QSA,L]
```

* 各種設定と、CGIの「app」を実行してね。の処理
```index.py
#!/usr/local/bin/python3
# coding: utf-8

from server import app
from wsgiref.handlers import CGIHandler

import os
 
# SSLしか認めないとき
# os.environ["SERVER_PORT"] = "443"
# POSTしか認めないとき
# os.environ["REQUEST_METHOD"] = "POST"

CGIHandler().run(app)
```

* 「app」はFlaskだぜ。と、そのパスと分岐処理を記載
```test.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'Index Page'

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

```

## 【準備４】ファイルをpublic_htmlへアップロードする

前準備で作成した3つのファイルをWinSCP（Teratermでもいい）でpublic_htmlにアップロードする
アクセス権は、3ファイルとも「644」で良いと思う。

完成。
これで、自分用のURLを入力すれば「Index Page」とか「Hello, World」とブラウザに表示される、、、、はず。

# 表示されねぇ

## 必要なパッケージがインストールされていない
ブラウザからだと、内部のエラーが分からず、500 Internal Server Errorなどになったりしてモヤモヤします。
その場合、TeraTermで直接index.pyを実行してみます。
```
[hoge@xx2 ~]$ python3 index.py
```

そうすると、足りないパッケージが表示されるので、下記のように追加していきます。

```
[hoge@xx2 ~]$ python3 -m pip install <足りないパッケージ名>
```

## pipのバージョンが古いのが気になる
アップグレードしたい場合は、下記コマンドで
```
[hoge@xx2 ~]$ python3 -m pip install --upgrade pip --user
```

# 巻末
需要があるようなら、CORESERVERでDBに接続したり、cron動かしたり、、、の記事も追加します。