ConoHa WINGレンタルサーバーでPython! Webアプリcgiを動かす手順を紹介!3つの例あり【コピペで動く!】

スポンサーリンク
Python

私は国内最速、低価格で利用可能なConoha WINGにてブログを書かせていただいているのですが、実はWordPressサイト運営だけでなく、Pythonサーバーとして使うこともできます。24時間365日常に起動し続けるサーバーとしていろいろな利用ができたらいいと思いませんか?

トップページからは探しにくいですが、実際の「よくある質問」でも利用可能と書いてあります。

使用できるプログラム言語を教えてください。 Python

プログラム言語のパスを教えてください。 python3.6  /opt/alt/python36/bin/python3.6

Web設定について|ConoHa WINGサポート
ConoHa WINGのご利用ガイド、よくある質問などの各種サポート情報をご案内しています。ConoHa WINGは便利なご利用ガイドと専任スタッフのサポートで安心してご利用いただけます。

実際にインタラクティブに動くサーバー構築の手順や環境設定についてご紹介します。

環境確認

Conoha WINGでSSH接続できる環境があった方が作業は早くなるかと思いますが、Conohaコントロールパネルのファイルマネージャーからもある程度は作業はできます。

ファイルマネージャー側ではホームディレクトの下にpublic_htmlというフォルダがあります。WordPressの場合は自分のドメイン以下が外部に見えるようにできます。

今回の私の例では

https://worth2know.com/python/

以下にウェブアプリとなるhtmlファイルを配置し

https://worth2know.com/python/cgi-bin/

以下にPythonで書いたcgiファイルを配置していきたいと思います。

Conoha WINGはhtmlとcgiであることが必要です。

シンプルな例1

simple01.htmlは以下のようになります。

<!DOCTYPE html>
<html>
<head><meta charset="utf-8" /></head>
<h1>simple01</h1>
    <form action="cgi-bin/simple01.cgi" method="POST">
        <input type="submit" name="submit" value="送信">
    </form>
</body>
</html>

cgi-bin/ の下に置くsimple01.cgiは以下のようになります。

#!/opt/alt/python37/bin/python3
import sys
import io

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

print("Content-type: text/html; charset=utf-8\n")
print("<html>")
print("<body>")
print("<h1>simple01-out</h1>")
print("</body>")
print("</html>")

ファイルの属性を755変更します。

その結果は以下のようになります。

送信ボタンを押すとcgi-bin/simple01.cgiが実行されて以下のような画面に代わります。

ブログに埋め込むとこのように表示されます。

シンプルな例2

引数をとる場合を紹介します。simple02.htmlを以下のように記述します。

<!DOCTYPE html>
<html>
<head><meta charset="utf-8" /></head>
<h1>simple02:入力値の積を表示します</h1>
    <form action="cgi-bin/simple02.cgi" method="POST">
        値1を入力してください
        <input type="number" name="a"><BR>
        値2を入力してください
        <input type="number" name="b"><BR>
        <input type="submit" name="submit" value="送信">
    </form>
</body>
</html>

cgi-bin/ の下に置くsimple02.cgiは以下のようになります。

#!/opt/alt/python37/bin/python3
import sys
import io

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

import cgi
import cgitb
import math
import json

cgitb.enable()

form = cgi.FieldStorage() #クエリ文字列の値を取得
a = int(form['a'].value) 
b = int(form['b'].value)
c = a*b

print("Content-type: text/html; charset=utf-8\n")
htmlText = '''
<!DOCTYPE html>
<html>
    <head><meta charset="shift-jis" /></head>
    <p>入力値の積は&nbsp; %s<br/></p>
    <hr/>
    <a href="../simple02.html">戻る</a> 
</body>
</html>
'''

print(htmlText % c)

パーミッションを755にした結果は以下のようになります。

ブログに埋め込むとこのように表示されます。

ちなみに、URLでダイレクトに指定もできます。

https://worth2know.com/python/cgi-bin/simple02.cgi?a=10&b=5

cgiの後ろに ? とそこに引き渡すaとbの値を直に指定することも可能です。

シンプルな例3

もう少し複雑にして、米国株の株価取得もできます。simple03.htmlは以下のようになります。

<html>
  <head>
    <meta charset=utf-8>
    <title>Sample</title>
  <head>
  <body>
    <h2>株価検索</h2>
    <form action=cgi-bin/simple03.cgi method=post>
    <input type="text" name="code">
    <input type=submit name=submit>
  </form>
  </body>
</html>

cgi-bin/ の下に置くsimple03.cgiは以下のようになります。

#!/usr/local/bin/python
import sys
import io

import cgi
import cgitb
import math
import json

import pandas as pd
import datetime
import numpy as np
import pandas_datareader as web

cgitb.enable()
form = cgi.FieldStorage()
name = form.getvalue('code', '')

end = datetime.date.today()
start = end - datetime.timedelta(days=5)

df = web.DataReader(name, "yahoo",start=start, end=end)["Adj Close"]

latest = name + " " + df.index[-1].strftime('%Y/%m/%d')+ " " + "の終値は" + str(df[-1])

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

print('Content-Type: text/html; charset=UTF-8\n')
htmlText = """
<!DOCTYPE html>
<html>
<head><title>Sample</title>
</haed>
<body>
<h1>Your input is : "%s"</h1>
<hr>
<a href="../simple03.html">再検索</a></p>
</body>
</html>
"""

print(htmlText % (name))
print(latest)

ブログに埋め込むとこのように表示されます。

前回と変わっている部分は最初の行の #!/usr/local/bin/python などでしょうか。

自分の開発環境に寄せたかったので、こちらにしてみました。

また、PATHを通したり、PIPで外部ライブラリのインストールなどが必要になったりしますが、今回は割愛させていただきます。

本格的なプロダクトやWebアプリを作るのであればもう少し自由度がある開発環境の方がいいと思いますが、簡単なプロトタイプ制作や動作確認、データ取得サーバーとしてはお手軽に使えるものかと思います。

もし、すでにブログ等でサーバーをレンタルしていて、Webアプリでいろいろなサービスを展開してみたいと思っている方は検討してみてはいかがでしょうか。

以下のような記事と組み合わせて以下のようなWebアプリも作ることができます。

データは直近一年のデータを読み込んでチャート化するものとなっています。

Webアプリ作成の他の選択肢

Conohaを使わないWebアプリについてはHerokuという選択肢もあります。

Herokuについては以下の記事で触れています。

また、もう少しお手軽にWeb上の外部データにアクセスする場合はGoogle Spread SheetとData Potalという選択肢もあります。それについてはこちらの記事で取り上げています。

興味ある方はご参考にしていただければと思います。

参考にさせていただいたサイト

Pythonで書いた自前のCGIをConoHa WINGで動かしてみる

Pythonをレンタルサーバーで動かす最も簡単な方法
DjangoもFlaskも使わず、VPSではないレンタルサーバーでシンプルなPythonアプリを公開することができる簡単な方法を紹介します。

SEO,Pythonに関する記事をご紹介します。

Python高速化! for文は遅いので、”これ”を使うと30倍早いですよ!【Google ColabのPython:コピペで動く!】
【コピペで動く!】Pythonで1.5GBのcsvファイル読み込み高速化:1分5秒⇒4秒程度 DASK , pickle (Pythonコードあり)
【コピペで動く!】日本株、米国株で個別銘柄ベータ値(β値)を簡単に調べる方法 Python 米国株 Webサービス&コード 【Google Colabで違いをみつけろ!】
【解決】Google ColabのPythonでエクセル(Excel)ファイルやCSVファイルに出力・入力する方法【コピペで動く!】
【コピペで動く!】Google ColabでPython を用いての 効率的フロンティア と ポートフォリオの最適化 Efficient Frontier & Portfolio Optimization with Python [Part 2/2]
【解決】スクレイピングでHTTP Error 403: Forbiddenでアクセスできないときに試すべき方法【コピペで動く!】【Google Colab:Python:pd.read_html,selenium】
自動化・効率化でなにができるのか!Google FinanceやYahoo Financeからデータ取得して年初来パフォーマンスや週次騰落率のファクターチェック
【コピペで動く!】20行で資産運用モデル作成 Google ColabのPythonで 米国株の株価を取得し、グラフ・チャートを表示
過去50年間のS&P500の季節性の値動きから負けにくいポジション構築はできるのか考える・大統領選挙のアノマリー対応!【コピペで動く!】Google ColabのPythonで自分で調べてみよう!
自動化・効率化できます!金融向けGoogle スプレッドシートのすぐ使える簡単な使い方4選!(Google Finance,セントルイス連銀,アメリカ合衆国財務省,スクレイピング)【コピペで動く!】
エクセルでサブスクタイプの契約管理!契約期間を塗りつぶして可視化したり、月次契約金額の集計で予実管理!
pyfolioで米国株ETFの分析をWebアプリでできるようにしてみた!月ごとのリターンの分布やドローダウンの時期・深さなど可視化できます!
株価時系列データを分析する上で正規化を行う事の重要性について紹介する【違いをみつけろ!】
曜日による米国株指数(S&P500)のパフォーマンスに違いはあるのか?有利なポジション取りはできるのか?【Google ColabのPython:コピペで動く!】Twitterで出てくる知見は本当か自分で調べてみよう。
高配当ETFや金ETFが今年はどのような値動き・リターンかご存じですか? 新興国ETF、米国債ETFだけでなく原油ETFやナスダックETFなど、18種類のETF・指数の現状と傾向を知り、今後の予測に役立てよう!【Google Colab・コピペで動く!】

コメント

タイトルとURLをコピーしました