ばぐばぐわーるど

Pythonなどなど

Pythonで掲示板を作り公開する方法 その1

無料のレンタルサーバをでPythonで書いた自作の掲示板を設置します。
まずはPythonの使えるレンタルサーバを探しましょう。
僕はwkey.meを使わせていただきました。Python以外にもRuby,Perl,PHPも使えます。(ちなみに現在はメンテナンス中につき新規会員登録はできないようです。予定ではもうじき再開します)
以下の設定等は他のレンタルサーバでは上手くいかない部分があるかも知れません。
wkey.meでは公式のマニュアルを見ればホームページを作るとこまでは簡単にいけます。

まず完成したのがこれです。

f:id:jum12:20130930131429p:plain

bbs.py

ブラウザで戻ると再び書き込んでしまう、リロード時にも書き込んでしまうなどの問題はありますが、最低限の掲示板のふりはしています。removeを押すと全削除になります。

作るまでわかりにくかったとこ、困ったことを書いてきます。
掲示板自体はわりとすぐ作れましたが、CGIとして置くのが初めてなので苦労しました。
というわけで以下の説明はPythonとHTMLの基礎の基礎はわかるけど、CGIとか知らない人が対象です。

分かりにくそうなとこ。
  • 最初の設定

WEBサイトの作成時にCGI、Python、SuEXECにチェックします。
FTPユーザも設定してください。サーバにいろいろ送るときはFTPを使います。WkeyではSFTPは使えません。
FTPソフトはFileZillaを使いました。無料です。

ただPythonのスクリプトをサーバーに置いただけではアクセスしても実行できません。index.htmlのあるディレクトリに.htaccessがあると思います。無かったら作ってください。拡張子.pyを実行したい場合は以下の設定が必要です。

directoryindex index.py
AddHandler cgi-script .py 
AddHandler cgi-script .cgi

directoryindexはindex.htmlの役割をindex.pyに置き換えます。indexもpythonで書きたいなら必要です。
2行目が必要な設定です。3行目は.cgiでも使えるようにしてるだけです。

置いたpythonファイルは赤の他人が実行するものです。普通は自分だけが実行できるような設定になってるのでそのままではエラーがでます。
他人が実行しそうなファイルはパーミッション755とかに変更します。

  • 最低限必要な内容

CGIとして動かすなら以下は入れないとダメです。Hello Worldは必ずしもいらないですけど。

#!/usr/bin/python
print "Content-Type: text/plain"
print 
print "Hello World"

htmlなら"Content-Type: text/html"に変更してprintでhtmlを出力

  • httpd.confはいじれない

そこの設定はできません。
つまり、公式ドキュメントで推奨されてるwsgiとかmod_pythonとかは使えず、CGIを使わなければならないということです。
無料レンタルサーバでは当たり前だそうです。
話がそれてますが、ちょっと困ったのでメモ

困ったとこ

実際に作って置いたけど505エラーで実行できない。

  • 一行目を間違えまくる

wkeyではpythonの場所は/usr/bin/pythonです。
#!/usr/bin/pythonを#!usr/bin/pythonとしてしまいエラーが解消できずに困りました。
#!/usr/bin/pyhtonでエラーがでたこともありました。ナチュラルすぎてわかりません。

  • なにが原因なのか分からない

結構重要なのがエラー対策です。エラーがどれも505 internal server Errorなので何が原因かわかりません。頑張って探しても、ただただ時間が過ぎていきます。
これの対策としては、とりあえず#!/usr/bin/pythonの後に

import cgitb; cgitb.enable()

を加えときます。これでエラーが表示できることが多いです。
いやそれ加えてもエラー出るんだが・・・って人は

import sys
print "Content-Type: text/plain \n"
print "honyarara"
sys.exit()

とかをいろんな場所に入れて頑張ってみてください。

いやそれでも505が出るんだが・・・って人は一行目が違ったり、.htaccessパーミッションの設定がおかしい人です。
ここまでくれば原因を特定しやすいはずです。



長くなってきたので、掲示板そのものの話はその2へ。