みろりHP


緑色さんの多目的ブログ
みろりえいちぴー
引っ越し先: https://www.mrrhp.com
<< Mark Lutz『初めてのPython』つづきのつづき | main | 真・女神転生4FINAL 1.上野まで >>
| カテゴリ:- |
スポンサーサイト

一定期間更新がないため広告を表示しています

| スポンサードリンク | - | - |
| カテゴリ:プログラミング |
Python python3でウェブサーバを作る



(2017.04.22.追記)
これのリトライ「python3でウェブサーバを作る(Bottleでリトライ)」をした。



ウェブアプリケーション開発に適した言語であるPHPで自作のツールを作ったことがあったけれど、お気に入りの言語Pythonでもおんなじようなことってできねーかなあ。と思い手を出してみた。いや結構苦労したぜ、なにせ参考ページがなかなか見つからなくてなあ。それにPHPなら簡単にできたことが要領よくいかないのだよ。「ってことはつまりウェブスクリプトはPHPで書くのが最適であってPythonには向いてないんじゃねーの?」と気付いてこのプロジェクトを完全に放棄するまでに集まったtipsを書く(出落ち感がヤベエ)。
ちなみに、ページの構成は処理とhtmlを分けてスッキリさせるため、pyファイルとtplファイルに分ける。tplファイルにはhtmlを書き、pyファイル内から読み込む。



ディレクトリ構成
htdocs
  ├─cgiServer.py
  ├─data
  │   └─画像とかcssとかjsとか
  └─cgi-bin
      └─a.py(メインで読み込む), a.tpl(a.pyが読み込むhtml), ajax.py(ajaxでjsから読み込まれる)
cgiServer.pyのある階層、この場合はhtdocsがドキュメントルートとなる。pythonで読むファイルはcgi-binディレクトリに入れなければならない。pythonを介さず、htmlから読む静的なファイルはcgi-binの外に置かなければならない。
 
# cgiServer.py
import http.server
address = ("", 8000)
handler = http.server.CGIHTTPRequestHandler
server  = http.server.HTTPServer(address, handler)
server.serve_forever()
python cgiServer.py とだけ書いたbatファイルを同階層に置いておくとぱぱっと起動できてらく。
 
# a.py
print("Content-type: text/html¥n")
fopen = open("cgi-bin/a.tpl", encoding="utf-8")
lines = fopen.read()
fopen.close()
print(lines)
一行目の「これはhtmlですよ」宣言は一字一句そのままで存在していないとダメくさい。改行記号も必要。次にめちゃめちゃ詰まったところなのだけど、open()関数などでpythonが読み込むファイルのパスを相対パスで書く場合、ドキュメントルートであるところのhtdocsを始点とした相対パスで書かないといけない。わかるか、そんなもん。
 
# a.tpl<html><head><link href="../../data/css.css" media="all" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="../../data/js.js"></script></head><body>
<img src="../../data/img.jpg" /></body></html>
画像やcss、jsファイルはcgi-binの中に置くとエラーをはく。たぶんcgi-bin内のファイルはすべてpythonコードとして扱われるのだろうなあ。ディレクトリ構成図に書いたとおりcgi-binの外に置く。このせいで、ウェブアプリケーションのファイル郡を1ファイルにまとめることができない。かつ、そういったpythonからではなくhtmlから読まれる静的ファイルの相対パスは、ファイルがある場所を始点とする。あとhtmlの中でcharset=utf8を指定すると文字化けする。理由はさっぱりワケワカメ。
 
// jsファイルのajax処理部分(jQuery使用)
function event(m)
{
    $.ajax({
        url     :"ajax.py",
        type    :"get",
        data    :{"hello":"こんちゃ"},
        dataType:"html"
    })
    .done(function(data) {
        $("#ajax").html(data);
    })
    .fail(function(data) {
        console.log("Ajax error.");
    })
}

# ajax処理で呼び出されるajax.pyファイル
print("Content-type: text/html¥n")
print("<html><head></head><body>")
import cgi
get = cgi.FieldStorage().getvalue("hello")
print(get)
print("</body></html>")
ajax.pyのほうでもContent-typeやhtmlだとかbodyのタグをつけないとダメっぽい。get、postデータを受け取るのはcgiモジュールで行う。うまくいけばこれでtplファイルのoutputタグの部分に「こんちゃ」が入る筈だが、文字化けする。charset=utf8をajax.pyのほうで指定しても変わらなかったのでお手上げだ。



こんなあたりでpythonウェブサーバで遊ぶのはヤメにした。今回得られた教訓としては「ネットに情報が少ないものは主流じゃないからヤメとけ」といったところか、いや、当たり前すぎるわ。
 
| 緑色 | プログラミング | comments(1) |
| カテゴリ:- |
スポンサーサイト
| スポンサードリンク | - | - |
http://www.salomonspeedcross3.us.com/ salomon xa pro 3d
http://www.katespadepurses.us.com/ kate spade backpack
http://www.pandora-jewelrysale.us.com/ pandora
http://www.louboutinredbottoms.us.com/ louboutin sneakers
http://www.kyrie-4.us.com/ lebron james shoes
http://www.birkenstocksandalssale.us.com/ birkenstock
http://www.hermesbirkin-handbags.us.com/ hermes purse
http://www.jordan11spacejams.us.com/ jordan 10
http://www.fitflops-sale.us.com/ fitflop sandals
http://www.longchampbag.us.com/ longchamp backpack
http://www.fitflopsshoes.us.com/ fitflops clearance
http://www.pandorajewelryscharms.us.com/ pandora bracelet
http://www.yeezyboost350shoes.us.com/ adidas yeezy boost
http://www.kd10-shoes.us.com/ kd 5
http://www.nikeairmax-90.us.com/ nike air max 2016
http://www.adidasnmdrunnerr1.us.com/ adidas yeezy
http://www.adidas-ultraboost.us.com/ adidas ultra boost
http://www.pandorajewelryrings.us.com/ pandora earrings
http://www.curry4-shoes.us.com/ under armour stephen curry men
http://www.jordans11shoes.us.com/ jordan shoes
http://www.lebron15-shoes.us.com/ lebron
http://www.pumafentyrihannashoes.us.com/ puma sneakers mens
http://www.adidasyeezy-350.us.com/ ultra boost uncaged
http://www.airmax90shoes.us.com/ nike air max 95
http://www.nikeairvapormaxflyknit.us.com/ air max 90
ドリフトliuyuzhen
| ultra boost | 2018/05/11 7:53 PM |









 123456
78910111213
14151617181920
21222324252627
282930    
<< April 2019 >>
+ みろりHP内検索
+ 閲覧記事
+ 過去記事アーカイブ
+ 年月選択
  • 2019年 02月 (1)
  • 2019年 01月 (2)
  • 2018年 12月 (6)
  • 2018年 11月 (6)
  • 2018年 10月 (3)
  • 2018年 09月 (8)
  • 2018年 08月 (4)
  • 2018年 07月 (6)
  • 2018年 06月 (5)
  • 2018年 05月 (4)
  • 2018年 04月 (7)
  • 2018年 03月 (6)
  • 2018年 02月 (6)
  • 2018年 01月 (8)
  • 2017年 12月 (9)
  • 2017年 11月 (9)
  • 2017年 10月 (4)
  • 2017年 09月 (6)
  • 2017年 08月 (6)
  • 2017年 07月 (8)
  • 2017年 06月 (4)
  • 2017年 05月 (7)
  • 2017年 04月 (8)
  • 2017年 03月 (7)
  • 2017年 02月 (10)
  • 2017年 01月 (6)
  • 2016年 12月 (8)
  • 2016年 11月 (8)
  • 2016年 10月 (5)
  • 2016年 09月 (5)
  • 2016年 08月 (7)
  • 2016年 07月 (9)
  • 2016年 06月 (6)
  • 2016年 05月 (8)
  • 2016年 04月 (10)
  • 2016年 03月 (10)
  • 2016年 02月 (8)
  • 2016年 01月 (10)
  • 2015年 12月 (9)
  • 2015年 11月 (6)
  • 2015年 10月 (5)
  • 2015年 09月 (4)
  • 2015年 08月 (8)
  • 2015年 07月 (5)
  • 2015年 06月 (3)
  • 2015年 05月 (7)
  • 2015年 04月 (8)
  • 2015年 03月 (12)
  • 2015年 02月 (8)
  • 2015年 01月 (4)
  • 2014年 12月 (5)
  • 2014年 11月 (5)
  • 2014年 10月 (7)
  • 2014年 09月 (4)
  • 2014年 08月 (7)
  • 2014年 07月 (6)
  • 2014年 06月 (4)
  • 2014年 05月 (12)
  • 2014年 04月 (9)
  • 2014年 03月 (6)
  • 2014年 02月 (6)
  • 2014年 01月 (8)
  • 2013年 12月 (7)
  • 2013年 11月 (10)
  • 2013年 10月 (10)
  • 2013年 09月 (9)
  • 2013年 08月 (11)
  • 2013年 07月 (10)
  • 2013年 06月 (9)
  • 2013年 05月 (15)
  • 2013年 04月 (11)
  • 2013年 03月 (5)
  • 2013年 02月 (7)
  • 2013年 01月 (6)
  • 2012年 12月 (9)
  • 2012年 11月 (10)
  • 2012年 10月 (10)
  • 2012年 09月 (4)
  • 2012年 08月 (2)
  • 2012年 07月 (7)
  • 2012年 06月 (13)
  • 2012年 05月 (13)
  • 2012年 04月 (15)
  • 2012年 03月 (4)
  • 2012年 02月 (12)
  • 2012年 01月 (9)
  • 2011年 12月 (5)
  • 2011年 11月 (13)
  • 2011年 10月 (2)
  • 2011年 09月 (2)
  • 2011年 08月 (1)
  • 2011年 06月 (1)
  • 2011年 05月 (4)
  • 2011年 04月 (10)
  • 2011年 03月 (8)
  • 2011年 02月 (11)
  • 2011年 01月 (14)
  • 2010年 12月 (14)
  • 2010年 11月 (17)
  • 2010年 10月 (17)
  • 2010年 09月 (19)
  • 2010年 08月 (22)
  • 2010年 07月 (18)
  • 2010年 06月 (16)
  • 2010年 05月 (19)
  • 2010年 04月 (15)
  • 2010年 03月 (22)
  • 2010年 02月 (18)
  • 2010年 01月 (18)
  • 2009年 06月 (2)
  • 2007年 12月 (10)
  • 2007年 11月 (7)
  • 2007年 10月 (9)
  • 2007年 09月 (4)
  • 2007年 07月 (5)
  • 2007年 06月 (11)
  • 2007年 05月 (6)
  • 2007年 04月 (4)
  • 2007年 03月 (1)
  • 2006年 01月 (21)
  • + カテゴリ
    + ブックマーク
    + 最近のコメント
    + アクセスカウンター
    全体(since 2010.02.03.)
    今日… 昨日…