【さくらレンタルサーバー】flaskを使ってみる。

## はじめに
レンタルしたさくらレンタルサーバー（スタンダードプラン）に、APIサーバーを立てようと思ってflaskを使ってみる。（**さくらレンタルサーバでは常駐デーモンプロセスは許可されていないため、注意が必要**）
詰まった点もあったので、その対処法も合わせて記録する。

- 環境設定は、以下のページに従った。
> [Try #019 – さくらのレンタルサーバでFlaskを利用した住所検索APIを構築してみた](https://day-journal.com/memo/try-019/)

- 作るアプリケーションは、以下のページに従った。
>[【サクラレンタルサーバー】 (初心者向け) PythonとpyenvとFlaskの環境構築方法。| cshの場合](https://qiita.com/peace098beat/items/de9fdadfc4128e99bca6)

## 手順

- /home/(UserName)/www/hello以下に、`.htaccess`,`app.py`,`index.cgi`の三つのファイルを作成
- chromeから`https://(UserName).sakura.ne.jp/hello/`にアクセス

`.htaccess` : Apacheの制御設定ファイルの一つ。通常Apacheの制御を行う`httpd.conf`はWEBサーバー全体の制御を行っているため、サーバー管理者しか変更することができない。さくらレンタルサーバー上で自分専用に設定を変えたい場合は、`.htaccess`を変更する。

>[cman.jp: htaccessとは？](https://htaccess.cman.jp/sense/)

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

```python:app.py
#!/home/miyablo/.pyenv/versions/flask_peewee_3.6.4/bin/python
# -*- coding: utf-8 -*-
from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return "Hello World!\n"

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

```

```python:index.cgi
#!/home/miyablo/.pyenv/versions/flask_peewee_3.6.4/bin/python

import cgitb
cgitb.enable()

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

## 発生したエラーとその対応
### chromeからのアクセス時
chromeから`https://(UserName).sakura.ne.jp/hello/`にアクセス時に、以下の表示が。
<img width="1339" alt="スクリーンショット 2019-11-02 17.07.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270898/60dfbf4a-9d81-f3a8-4b2a-f53dba3c9659.png">

### ファイルの直接実行時
ssh接続したさくらサーバーのコマンドライン上で、`$python index.cgi`コマンドにて直接`index.cgi`を実行してみると、以下のようなエラーが。
<img width="446" alt="スクリーンショット 2019-11-02 17.09.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270898/6183a7b4-578c-7bf7-eed0-eda02ff738a4.png">

### index.cgiの書き換え
このエラーが以下のページと同じエラーだったので、以下のページに書かれているように`index.cgi`ファイルを編集。

>[さくらのレンタルサーバーでFlaskを使おうとして困ったことを残しておく．](https://note.mu/h_takase/n/nad97e9a6a05b)

```python:index.cgi
#!/home/miyablo/.pyenv/versions/flask_peewee_3.6.4/bin/python

import cgitb
cgitb.enable()

from wsgiref.handlers import CGIHandler
from app import app
#-------------------以下、書き換え部分------------------------
from sys import path

path.insert(0, '/miyablo/www/hello/')
from app import app
class ProxyFix(object):
  def __init__(self, app):
      self.app = app
  def __call__(self, environ, start_response):
      # ※要書き換え
      environ['SERVER_NAME'] = "miyablo.sakura.ne.jp"
      environ['SERVER_PORT'] = "80"
      environ['REQUEST_METHOD'] = "GET"
      environ['SCRIPT_NAME'] = ""
      environ['PATH_INFO'] = "/"
      environ['QUERY_STRING'] = ""
      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)
```

### index.cgiの直接実行

今度はエラーなく実行することができた。
<img width="690" alt="スクリーンショット 2019-11-02 17.22.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270898/1d08177b-e909-8fa3-d970-40471391792f.png">

しかしながら、いまだにchromeからのアクセスではinternal server errorが発生している。

### ファイルアクセス権限の書き換え

`$ ls -la`を実行すると、現状では以下。
<img width="690" alt="スクリーンショット 2019-11-02 17.27.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270898/725affad-9709-5374-d1dc-ef61ace9f3df.png">

ここで、`chmod 744 index.cgi`として、実行権限を付与する。
<img width="690" alt="スクリーンショット 2019-11-02 17.28.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270898/02a52111-e410-8e25-2581-a1ddf354a13f.png">

こうすることで、chromeからでもhello worldが確認できた！

<img width="489" alt="スクリーンショット 2019-11-02 17.29.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270898/d2f9a379-fac4-4618-b2a2-66b935f7ea5a.png">

## 結びに
ちなみに、権限はどの程度あればいいのかと思って色々試した結果、最低限

- .htaccessに所有者の読み取り権限
- index.cgiに所有者の読み取り・実行権限

があれば、正常に反応を返すことがわかった。
<img width="582" alt="スクリーンショット 2019-11-02 17.36.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270898/296242e3-9f46-d3de-cae5-acb3f90b1a6d.png">

app.pyになんの権限も付与されていないでも動くってのは不思議だなぁ。

## 参考文献
[Try #019 – さくらのレンタルサーバでFlaskを利用した住所検索APIを構築してみた](https://day-journal.com/memo/try-019/)
[さくらのレンタルサーバーでFlaskを使おうとして困ったことを残しておく．](https://note.mu/h_takase/n/nad97e9a6a05b)
[chmod? chown? よくわからんって人のための、ファイル権限系まとめ](https://qiita.com/t-a-run/items/239ed690ece7a011804a)