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は、下記の通りです。
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を定義するだけです。
#!/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のテンプレートは、
<!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>© {{ 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
-