AB型技術系 主に備忘録

ほぼプログラム関連の備忘録

Bottleのルーティング機能を試す

スターサーバーでBottleを使ったページを表示させることができました。

freelancer.hatenablog.jp

今回は動的ルーティングを試しました。

サンプルプログラム

index.py

#!/usr/bin/python3.6

from bottle import route, run, template

@route('/')
def index():
    return template("sample", name="テスト")

※
@route('/<name>')
def test(name):
    return template("sample", name=name)

run(server='cgi')

※ ルートディレクトリ/xxxにアクセスするとtest(name)が実行され、引数のnameにはxxxが設定される

sample.html

<html lang="ja">
    <head>
        <title>サンプル</title>
    </head>
    <body>
        {{ name }}
    </body>
</html>

これで/xxxにアクセスすると画面上にxxxが表示されるはずなのですが・・・

f:id:freelancer13:20210922003640p:plain
404エラー

404エラーになりました。

index.pyにアクセスできていないようですね。

下記のようにURLを変更すれば表示されるようになりました。

/index.py/xxx

f:id:freelancer13:20210922011842p:plain
/index.py/xxx

日本語も大丈夫

/index.py/テスト

f:id:freelancer13:20210922012639p:plain
/index.py/テスト

しかしできるならドキュメントルート+ "/xxx"でちゃんと表示されるようにしたいですね。
.htaccessに下記を追加してURLをリライトするようにします。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.py$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.py/%{REQUEST_URI} [L]
</IfModule>

/xxxにアクセスするとURLの表示内容は変わらないけど裏では /index.py/xxxにアクセスするようになります。

.htaccessを更新して/xxxにアクセスすると

f:id:freelancer13:20210922011842p:plain
/xxx

表示されました。

index.pyをコントローラにすれば動的なページの作成も簡単に実装できそうです。


スターサーバーでBottleを使ってPythonで作成したページが表示されるか?

前回スターサーバーでPythonで実装したページを表示させることができました。

freelancer.hatenablog.jp

今回はPythonのいくつかあるフレームワークをスターサーバーで動かせるかを試してみます。

Pythonフレームワーク

ググってみると下記のフレームワークが見つかりました。

フレームワークの特徴

Djangoは最も普及していて多機能
FlaskはDjangoより機能が絞られていて軽量
Bottleは一番機能がシンプルで軽量

Django、Flaskは公式からファイルをダウンロードして配置というわけにはいかず、
pipコマンドというインストール用のコマンドを実行する必要があるので
レンタルサーバーに導入できるか微妙

Bottleは1ファイルだけの構成なのでダウンロードしたファイルをサーバーに
アップロードすれば使えずはず
ということで使うフレームワークはBottleに決定

Bottleのダウンロードと設定変更

公式サイトからbottle.pyをダウンロードする。

bottlepy.org

Download and Installのbottle.pyをクリックすればダウンロードできます。

bottle.pyのコマンドパスを変更

!/usr/bin/python3.6

サンプルプログラム

index.py

#!/usr/bin/python3.6

# ※1
from bottle import route, run, template

# ※2
@route('/')
def index():
    return template("sample", name="テスト")
# ※3
run(server='cgi')

※1 同じ階層にあるbottle.pyから route, run, templateという名前の関数をインポート

f:id:freelancer13:20210912125212p:plain
route
f:id:freelancer13:20210912125336p:plain
run
f:id:freelancer13:20210912125350p:plain
template

※2 ドキュメントルートにアクセスするとindex()が実行される

※3 pythoncgiとして実行するための設定

sample.html

htmlはテンプレートとして作成します

<html lang="ja">
    <head>
        <title>サンプル</title>
    </head>
    <body>
        {{ name }}
    </body>
</html>

index.pyの下記の個所でテンプレートを読み込んでname部分を"テスト"に置換して出力されるようにしてます。

return template("sample", name="テスト")

なお、bottle.pyのソースを確認すると、テンプレートを配置するディレクトリはデフォルトでは同じ階層かviewという名前のディレクトリになります。

f:id:freelancer13:20210912130904p:plain
テンプレートを配置するディレクトリの設定

テンプレートの拡張子は'tpl', 'html', 'thtml', 'stpl'のようです。

f:id:freelancer13:20210912131347p:plain
テンプレートの拡張子の設定

サーバーにアップロード

f:id:freelancer13:20210912131715p:plain
ドキュメントルート
f:id:freelancer13:20210912131749p:plain
viewディレクト

この状態でアクセスすると

f:id:freelancer13:20210912131901p:plain
表示結果

無事表示されました。

まとめ

意外と簡単にBottleを使って画面が表示できました。
テンプレートもシンプルで分かりやすいのでループを使ったりdict型のデータで置換できたりする方法が分かれば
個人のページのような規模の小さいページ作るならBottleはありかなと思いました。


スターサーバーでPythonをテストした時のこと

スターサーバーでPythonで実装したページを表示させた時のメモです

スターサーバーでPythonが使えるのか?

以下のリンク先に掲載されてますが、2.7.x、3.4.x、3.6.xが使えるようです

www.star.ne.jp

.htaccessの作成

Pythonで実装したプログラムをCGIスクリプトとして扱うために
.htaccessを作成し以下を追記する

AddHandler cgi-script .py
DirectoryIndex index.php index.html index.py

2行目はindex.pyをデフォルトドキュメントにするための設定

サンプルプログラム1

#!/usr/bin/python3.6

print("Content-Type: text/html; charset=utf-8")
print("<html><meta charset='utf-8'><body>")
print("<h1>テストページ</h1>")
print("</body></html>")

サーバーにアップロード

f:id:freelancer13:20210910010014p:plain
サーバーのルートディレクト

実行権限与えないと500エラーが発生するみたいなので権限を付与してます

この状態でindex.pyにアクセスしてみると・・・

f:id:freelancer13:20210910011738p:plain
スターサーバー 500エラー

500エラーが発生
改行コードはLFでないと500エラーが発生するという情報があったのでCRLFからLFに変えて再度試すも解消せず

サンプルプログラム2

#!/usr/bin/python3.6

print("Content-Type: text/html; charset=utf-8\n")
print("<html><meta charset='utf-8'><body>")
print("<h1>テストページ</h1>")
print("</body></html>")

Content-Typeの最後に改行がないと500エラーが発生するという情報があったので改行を追加

この状態でindex.pyにアクセスしてみると・・・

f:id:freelancer13:20210910021826p:plain
真っ白画面

500エラーは発生しないが真っ白

ソースを確認してみると

f:id:freelancer13:20210910022044p:plain
ソース

body以降が出力されていない

怪しいのは日本語出力か?

ということでまたまた修正

サンプルプログラム3

#!/usr/bin/python3.6

print("Content-Type: text/html; charset=utf-8\n")
print("<html><meta charset='utf-8'><body>")
print("<h1>aaa</h1>")
print("</body></html>\r\n")
f:id:freelancer13:20210910023100p:plain
半角英字の出力確認

やはり日本語が問題でした

標準出力をエンコードすれば日本語が出力できるようになるみたいなので修正

サンプルプログラム3

#!/usr/bin/python3.6

import sys, io

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding = 'utf-8')

print("Content-Type: text/html; charset=utf-8\n")
print("<html><meta charset='utf-8'><body>")
print("<h1>テストページ</h1>")
print("</body></html>")
f:id:freelancer13:20210910024247p:plain
日本語出力の確認

日本語が出力されました。

まとめ

  • ソースの改行コードはLFにする
  • Content-Typeの最後には改行が必要
  • 日本語を出力するには標準出力をエンコードする

次はPythonフレームワークを使えるようにしたいと思います。


M1チップ搭載MacBook AirにIntelliJ(日本語化も含む) とJavaをインストール

IntelliJをインストール

IntelliJのサイトからインストーラーをダウンロードします。
ダウンロードするのは無償のCommunity 版。

www.jetbrains.com

ダウンロードしたインストラーを起動しApplicationsにドラッグする

f:id:freelancer13:20210411111009p:plain

インストールされていることを確認

f:id:freelancer13:20210411110941p:plain

日本語化

IntelliJを起動するとデフォルトが英語なのでメニュー等は当然英語です。

f:id:freelancer13:20210411111642p:plain

Pluginsをクリックして検索ワードに"japan"と入力して検索
日本語言語パックが表示されるのでインストール

f:id:freelancer13:20210411111800p:plain

IntelliJを再起動して日本語化完了

f:id:freelancer13:20210411112039p:plain

プロジェクト作成

Javaモジュールを選択

f:id:freelancer13:20210411140700p:plain

JDKがないのでプルダウンを開いてJDKのダウンロードを選択してダウンロード

f:id:freelancer13:20210411141116p:plain

JDKを選択して次へ

f:id:freelancer13:20210411141550p:plain

テンプレートは未選択で次へ

f:id:freelancer13:20210411141840p:plain

プロジェクト名を入力して次へ

f:id:freelancer13:20210411141820p:plain

プロジェクトの作成が完了

f:id:freelancer13:20210411141954p:plain

テスト用のクラスを作成

f:id:freelancer13:20210411164409p:plain

実行結果

f:id:freelancer13:20210411164458p:plain

これで開発環境が整いました。

後はソース管理にGITを使ってるのでインストール手順も記録したいです。



M1チップ搭載MacBook Airを購入したので開発環境を構築してみる

Mac製品を初購入

今まで仕事もプライベートもWindowsしか使用してませんでしたが、
Macの環境があるとWebサイトの動作確認等で使えそうだなと思って昨年末に購入。
現在はまだまだ入力やショートカットキーを把握できず使いこなせていない状況。
早く慣れたいので現在Windowで開発してる案件の開発環境をMacの環境に構築しMacに触れる機会を増やそうと思います。

インストールするアプリケーション

言語はJavaフレームワークはSpringBootを使用してるので下記アプリケーションさえあれば開発は可能です。

IntelliJ IDEA(MacApple Silicon)

www.jetbrains.com

Azul Zulu JDK 8(Mac版)

Download Java for Azure - New - Azul

必要なファイルをダウンロードして準備完了。