Lolipop格安サーバーで作るPython Web Content

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/511181a0-807d-e80f-e5b6-921150919453.png)

pip コマンドを使えるようにする。

```
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
$ python get-pip.py --user
```
$ pwd
/home/users/0/sub.jp-hrd
```

```
.bash_profileの編集
$vi .bash_profile

PATH=$PATH:/home/users/0/sub.jp-hrd/.local/bin
export PATH

$ source .bash_prof
```
この作業でpip等が使えるようになる。

```
pip install bottle --user
```
####pipでinstallするとき--userオプションをつけるとユーザーディレクトリにインストールしてくれる。

```
$ pip freeze
DEPRECATION: Python 3.4 support has been deprecated. pip 19.1 will be the last one supporting it. Please upgrade your Python as Python 3.4 won't be maintained after March 2019 (cf PEP 429).
Beaker==1.10.0
bottle==0.12.13
bottle-auth==0.3.3
bottle-beaker==0.1.3
bottle-mongo==0.3.0
bottle-sqlite==0.1.3
certifi==2019.9.11
```
###lolipopの格安サーバーでpython/Bottleを動作するためには、mod_wsgiが使えないため工夫が必要です。
##フォルダー パスの一覧
``` 
W3
│  .htaccess 
└─app
    │  .htaccess
    │  app.py
    │  routes.py
    │  
    ├─static
    │  ├─content
    │  │      bootstrap-grid.css
    │  │      bootstrap-grid.css.map
    │  │      bootstrap-grid.min.css
    │  │      bootstrap-grid.min.css.map
    │  │      bootstrap-reboot.css
    │  │      bootstrap-reboot.css.map
    │  │      bootstrap-reboot.min.css
    │  │      bootstrap-reboot.min.css.map
    │  │      bootstrap.css
    │  │      bootstrap.css.map
    │  │      bootstrap.min.css
    │  │      bootstrap.min.css.map
    │  │      jumbotron.css
    │  │      site.css     
    │  ├─fonts
    │  │      glyphicons-halflings-regular.eot
    │  │      glyphicons-halflings-regular.svg
    │  │      glyphicons-halflings-regular.ttf
    │  │      glyphicons-halflings-regular.woff      
    │  └─scripts
    │          bootstrap.bundle.js
    │          bootstrap.bundle.js.map
    │          bootstrap.bundle.min.js
    │          bootstrap.bundle.min.js.map
    │          bootstrap.js
    │          bootstrap.js.map
    │          bootstrap.min.js
    │          bootstrap.min.js.map
    │          jquery-1.10.2.intellisense.js
    │          jquery-1.10.2.js
    │          jquery-1.10.2.min.js
    │          jquery-1.10.2.min.map
    │          jquery.validate-vsdoc.js
    │          jquery.validate.js
    │          jquery.validate.min.js
    │          jquery.validate.unobtrusive.js
    │          jquery.validate.unobtrusive.min.js
    │          modernizr-2.6.2.js
    │          respond.js
    │          respond.min.js
    │          _references.js          
    ├─views
    │      about.tpl
    │      contact.tpl
    │      home.tpl
    │      index.tpl
    │      layout.tpl
```
w3ディレクトリがwebのルートと仮定すると直下に配置された.htaccessは、下記の通りです。

``` .htaccess
RewriteEngine on
RewriteRule ^(.*).py$ https://w3.hrd.co.jp/app/$1 
RewriteRule ^(.*)$ https://w3.hrd.co.jp/app/app.py/$1
DirectoryIndex app.py
```
上記の`https://w3.hrd.co.jp`をあなたのドメインに変更してください。
この表記は、sweb serverのurlを書き直します。
`RewriteRule ^(.*).py$ https://w3.hrd.co.jp/app/$1` 
https\://w3.hrd.co.jpを要求されたときに`https://w3.hrd.co.jp/app/app.py`に書き直します。
app.pyは、Web serverのイベントループに入るためapp.pyの直下のディレクトリにviews等をアクセスしなければなりません。下記で実現します。
```RewriteRule ^(.*)$ https://w3.hrd.co.jp/app/app.py/$1```
app.pyは、routesを定義するだけです。

```app.py
#!/usr/local/bin/python3.4
# -*- coding: utf-8 -*-
from bottle import *
import routes
run(server='cgi')
```

```
#!/usr/local/bin/python3.4
# -*- coding: utf-8 -*-
from bottle import *
from datetime import datetime
import requests
js=[('coffee','コーヒー'),('1', '1'), ('2', '2'), ('3', '3'), ('4', '4'), ('5', '5'), ('6', '6'), ('7', '7'), ('8', '8'), ('9', '9'), ('10', '10'), ('11', '11'), ('12', '12'), ('TV', 'TV'), ('cup', 'CH+'), ('cdwn', 'CH-'), ('vup', 'Vol+'), ('vdwn', 'Vol-'), ('vcut', '消音'), ('bs', 'bs'), ('cs', 'cs'), ('bs1', 'bs1'), ('bs2', 'bs2'), ('bs3', 'bs3'), ('bs4', 'bs4'), ('bs5', 'bs5'), ('bs6', 'bs6'), ('bs7', 'bs7'), ('bs8', 'bs8'), ('bs9', 'bs9'), ('bs10', 'bs10'), ('bs11', 'bs11'), ('bs12', 'bs12'), ('inUp', 'inUp'), ('inDwn', 'inDwn'), ('ent', 'ent'), ('on', '全灯'), ('off', '消灯'), ('fav', 'お好'), ('small', '保安灯'), ('lup', '明'), ('ldwn', '暗'), ('ac', '冷房'), ('acoff', '停止'), ('heeting', '暖房'), ('Joshitsu', '除湿'), ('ron', 'ラジオ'), ('r1', 'R1'), ('r2', 'R2'), ('r3', 'R3'), ('r4', 'R4'), ('r5', 'R5'), ('r6', 'R6'), ('r7', 'R7'), ('r8', 'R8'), ('r9', 'R9'), ('r0', 'R0'), ('R+', '+'), ('R-', '-'), ('r>', '>')]
@route('/')
@view('index')
def home():
    return dict(
        year=datetime.now().year,app="/app"
    )
@route('/home')
@view('home')
def home1():
    return dict(
        year=datetime.now().year,js=js,app="/app"
    )
@route('/contact')
@view('contact')
def contact():
    return dict(
        title='Contact',
        message='Your contact page.',
        year=datetime.now().year,app="/app"
    )
@route('/about')
@view('about')
def about():
    return dict(
        title='About',
        message='Your application description page.',
        year=datetime.now().year,app="/app"
    )
def mq(idx):
    url='https://api.beebotte.com/v1/data/write/HomeControl/cmd?token={mq token}'
    r=requests.post(url,{'data':idx})
@route('/click/<idx>')
def click(idx):
    mq(idx)
    return idx
```
viewのテンプレートは、

``` lyout.tpl
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
	<meta http-equiv="Cache-Control" content="no-cache">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{{ title }} - My Bottle Application</title>
    <link rel="stylesheet" type="text/css" href="{{app}}/static/content/bootstrap.min.css" />
	<link href="{{app}}/static/content/jumbotron.css" rel="stylesheet" />
    <link rel="stylesheet" type="text/css" href="{{app}}/static/content/site.css" />
    <script src="{{app}}/static/scripts/modernizr-2.6.2.js"></script>

    <script src="{{app}}/static/scripts/jquery-1.10.2.js"></script>
    <script src="{{app}}/static/scripts/bootstrap.js"></script>
    <script src="{{app}}/static/scripts/respond.js"></script>
</head>

<body>
    <nav class="navbar navbar-expand-md navbar-dark fixed-top bg-dark">
      <a class="navbar-brand" href="#">Boostrap4</a>
      <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarsExampleDefault" aria-controls="navbarsExampleDefault" aria-expanded="false" aria-label="Toggle navigation">
        <span class="navbar-toggler-icon"></span>
      </button>

      <div class="collapse navbar-collapse" id="navbarsExampleDefault">
        <ul class="navbar-nav mr-auto">
          <li class="nav-item active">
            <a class="nav-link" href="/">Home <span class="sr-only">(current)</span></a>
          </li>
         <li class="nav-item">
            <a class="nav-link" href="/home">HomeControl</a>
          </li>
          <li class="nav-item">
            <a class="nav-link" href="/about">About</a>
          </li>
          <li class="nav-item">
            <a class="nav-link" href="/contact">Content</a>
          </li>
          <li class="nav-item dropdown">
            <a class="nav-link dropdown-toggle" href="http://example.com" id="dropdown01" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Dropdown</a>
            <div class="dropdown-menu" aria-labelledby="dropdown01">
              <a class="dropdown-item" href="#">Action</a>
              <a class="dropdown-item" href="#">Another action</a>
              <a class="dropdown-item" href="#">Something else here</a>
            </div>
          </li>
        </ul>
        <form class="form-inline my-2 my-lg-0">
          <input class="form-control mr-sm-2" type="text" placeholder="Search" aria-label="Search">
          <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
        </form>
      </div>
    </nav>


    <div class="container body-content">
        {{!base}}
        <hr />
        <footer>
            <p>&copy; {{ year }} - My Bottle Application</p>
        </footer>
    </div>
</body>
</html>
```
{{app}}は、ディレクトリを調整するために使っています。
css,javascriptの入っているstaticフォルダのアクセスをapp変数を使ってroutes.pyから渡します。下記のapp='/app'

```
@route('/')
@view('index')
def home():
    return dict(
        year=datetime.now().year,app="/app"
    )
```

ftpなどでデプロイしてapp.pyに実行権を渡せば

```
$ chmod 700 app.py
$ ls -al
-rwx------ 1 sub.jp-hrd LolipopUser    134 2019-11-18 14:08 app.py
-
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/5abe965b-d8d0-0bb1-8a7d-c666ef448236.png)

###ソースコードは、
`https://github.com/yutakahirata/lolipop2019.git`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/431fb84c-92eb-db13-8de4-35ac392d3c39.png)