3
7

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-11-19

image.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は、下記の通りです。

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://github.com/yutakahirata/lolipop2019.git
image.png

3
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
7