MacでVSCode✖️Python✖️bottle ①viewがない

昨年、windows Updateの度に遅くなっていくwindowsマシンに嫌気が差してMacに乗り換えました。
でもこのMac。マシン自体は快適なんだけど、なかなかの曲者。
windows10✖️VScode✖️Python✖️bottle では起きなかったトラブルがちょこちょこ発生する。

最初に、トラブルが発生したのは、「テンプレートがみつかりません。」というエラー
この問題については、googleを検索すると、見つけたサイトを真似したらなんとか解決。
その解決方法は、下記の通りTEMPLATE_PATHにフォルダを追加するというもの。

from bottle import TEMPLATE_PATH
import os
TEMPLATE_PATH.append ( os.path.abspath(os.path.join(os.path.dirname(__file__), "views")))

今度は、cssファイル、jsファイルをアサインするために記述しても何故かMac環境では取得できていないご様子

@get('/static/<filePath:path>')
def index(filePath):
    return static_file(filePath, root='./static')

これも上のviewのテンプレートが取得できない時に同じで、
ローカルで実行する時、実行ファイルがルートにならないので、
この記述では取得できない。
そこで、実行の初期あたりで実行ファイルをルートに設定することで
staticで取得できなかったファイルを見事に取得することができました。
このへんは、仮想ターミナルなんかを使うと解決する話なのかな!?
まだまだ勉強不足。がんばろ♪

os.chdir(os.path.dirname(os.path.abspath(__file__)))

ロリポップでbottle②-postがgetに-解決編

久しぶりにbottleの話。
前回のロリポップでbottle①で詰まっていた箇所の解決編
bottleでもgetを利用する方法です。

前回、htaccessの制御では、getがpostに変更されてしまうというのがわかったので、
java scriptで制御して、リンク先アドレスを書き換えることにしました。

<script type="text/javascript">
	baseurl="/xxxxxxxxxx.cgi";
	$('.submit').click(function() {
	  $(this).parents('form').attr('action', baseurl + $(this).data('action'));
	  $(this).parents('form').submit();
	});
	$('.inlink').click(function() {
	  $(this).attr('href', baseurl + $(this).attr('href'));
	});
</script>

解説すると、baseurlには、pythonを記述しているcgi名を代入。
formのsubmitボタンを押されると、cgiファイルが先頭について実行され、
そして、単純な画面遷移の場合は、あらかじめ class名「inlink」にしておくことで、
リンクボタンを押された時に、cgiファイルが先頭について実行されます。
ただそれだけです。

このscriptはどの画面でも共通的に使用したいので、
footer.tplに入れて、bottleのテンプレートに、%includeで読み込むと便利です。

そして、localhostでテストする際は、baseurlは空白、
ロリポップにアップロードする時に、cgi名を入れることで思い通りに動かすことができます。

ロリポップでbottle①-postがgetに-

ロリポップのライトプランでbottleをやり初めて3ヶ月。
ローカルサイトで実現できる簡単なことも、なぜか動かないことが多数。今回は、ファイルをアップロードして読み込むことができないことにつまづいた。

実現したいことは、
WEB画面上のformで
・対象のテーブル名を選択
・CSV形式のローカルファイルを選択(form の file)
実行ボタンで、python側でファイルを読み込んで対象のテーブルにinsertしていくという処理

pythonで記述するのは、もう慣れてきたのでささっと、ローカル上は簡単に実現できたのだけど、それをロリポップにアップロード。

そして、いつもどおり、先頭の行を、
#!/usr/local/bin/python3.4
に変更して、最終行に
run(server=’cgi’)
を追加した。

いざ動かしてみると。反応がないっていうか動いてるの???状態
しかもエラーもでない。
悩むこと3日!!!
デバッグ代わりのログ出力なんかをいれたり、あれやこれやしてもさっぱりわからなかった。もしかして、キャッシュか??と思ってロリポップのキャッシュ削除をしてみたり。。。
キャッシュを疑ったので、formの送信先のurlを変えて、@post()の処理を追加したとき、
「405 method not arrow error」
最初の頃、よく見かけたなと、思い出し、@get()を追加するとエラーが消えた。
試してるうちに、どうもリクエストのpostがgetに変わっているということ???だからファイルが読めないの???

あっ!!!!

そういえば、ロリポップで動かすには、htaccessでリダイレクトしてたっけ?最初に設定してたから、その後意識してませんでした。

そう、リダイレクトしてなんらかの条件が揃うと、postがgetに置き換わるようで、ファイルのアップロードはどうやら難しいことが判明した。

とりあえず、原因発見した途端、すごい疲労感。
解決方法は後日考えよう・・・

医薬品の添付文書をHTML化する

仕事の一つに商品登録というのがあります。
当然のことながら、商品ごとに説明が違う。画像も大事だけど、テキスト情報も検索に関わってくるので、無視できないんですよね。

大抵は公式サイトからの情報のコピペしてるのだけど、
そんな中で、医薬品の添付文書は情報量も多いし、各メーカーのホームページ上では、あまり細かいところまで掲載されておらず、楽天市場なんかだと、販売の規定上、添付文書に記載のほとんどすべてを商品説明にいれておかなければ、罰金というルールもある。

そんななか、とっても有用なサイトがこちら。

「独立行政法人医薬品医療機器総合機構」が公開している
一般用医薬品・要指導医薬品の添付文書情報

このサイトは、一応薬局の担当者は使用してもOKとされて一般公開されているサイト。
このサイトを知らなかったときは、各メーカーのホームページにあるPDFの添付文書をひたすら手入力または他の通販サイト様から拝借していた。。。(基本、後者でしたが^^;)

このページで検索した医薬品添付文書を整形して、商品ページにコピペ。以前は、excelのマクロで組んでいたのですが、python勉強始めてからweb上で使える簡易ツールに変換してみました。

そのツールがこちら↓↓↓

簡易HTML形式に変換

変換ボタンを押すと、PC用にフル文書が、スマホ用に、効果効能と用量用法がコピーして使える状態で変換してあります。
医薬品の添付文書ではないときは、単純にテキストの改行ごとに<BR>が挿入される仕組みです。
こちらは、メモ帳で改行コードの変換方法を知らない人にも使ってもらえます。

そもそも各通販サイト。商品説明の更新がコード入力って 、どうなの!?

ロリポップでbottleを使う

前回更新から1ヶ月。ロリポップのライトプランでPythonを動かすのにメリットはあるのか??という自問をしながら、やっと簡単なツールを動かすことができました。

参考にしたサイトは、こちら
「PythonのWebフレームワーク Bottleをロリポップサーバ(ロリポプラン)で動かしてみる」

このサンプル通りなら動くのだけど、getをpostに変更しただけで、とたんに動かなくなってしまうし、一度動かして、サーバーエラー500が出た後は、修正してもしばらく動いてくれない。。。。などなど

一度は、phpで同じアプリを作ってしまったぐらい ^^;

それでも、やっぱりpythonでしょ!!と諦めずに取り組んだ結果、ようやくpostでも動きました♪♪

それがこちらのツール↓↓↓↓

テキストA-B単純比較

職場では、JANコード入力してプライスカードを出力する作業を某POSレジシステムに入っているツールを使っている。
しかし、レジ未登録の商品のプライスカードは、エラーも何も表示されず例えば50件出力しようとしても48件しかなかったら、じゃぁどの2件!?というのをこのツールで発見することができます。

以下は、備忘録として、動かなかった書き方

@route(“/display1″, method=”POST”)
def xxxxxxxxx() :
→最初に書いて撃沈

@route(“/display1”, method=[“GET”,”POST”])
def xxxxxxxxx() :
→これも駄目

@route(“/display1″, method=”GET”)
@route(“/display1″, method=”POST”)
def xxxxxxxxx() :
→defの前に2つ併記。ロリポップの契約2つあるうちの1つでは動くものの1つでは動かなかった。理由は不明。

成功した方法↓↓↓↓↓↓↓↓↓↓

@route(“/display1″, method=”GET”)
def xxxxxxxxx() :

@route(“/display1″, method=”POST”)
def xxxxxxxxx() :

get と post の処理を別途作成したら無事動きました。
試してないけど、@get や @post でも動きそう