作ったPythonスクリプトをWebサーバーで動かそう

パーミッション755

WebサーバーでPythonを動かそう。

前回の記事「Print文による文字列や数字の出力」でprint文の文法を学びました。

文字列や数字を出力することができるようになったと思うので、今度はそれを自分のパソコンではなくて、Webサーバーで動かしてみましょう。

せっかく作ったPythonスクリプトですから、Webサーバーで動かしてみんなが見られる状態で動かしたいですよね。

サーバーは何でもいいです。レンタルサーバーであれば、だいたいどこもPythonがインストールしてあると思うので、動くと思います。

個人的におすすめのレンタルサーバーはエックスサーバーです。

月額900円からと格安の割には、高速に動くし管理画面もとても使いやすいです。

後々、大規模なWebアプリケーションを作りたい場合にDjangoを使うと思うのですが、共有サーバーなのに一応Djangoが動かせるようです。

マルチドメインにも対応しているので、複数のサイトを運用することもできます。

最初のうちはエックスサーバーの一番安い月額900円からのプランで十分です。

レンタルサーバーを既に持っている人はそれを使っていただければ大丈夫です。

Hello, World!を出力しよう!

それでは、例によって、まずはHello, World!を出力しましょう。

print文などのPythonの文法については今までと同じです。

ただ、PythonをWeb上で動かすには、ちょっと一工夫が必要になります。

ぐだぐだ言ってても分からないと思いますので、まずコードを紹介します。


#!/usr/bin/python
# -*- coding: utf-8 -*-

print ("Content-Type: text/html\n\n")
print ("Hello World!")

これをFTPソフトなどを使ってサーバーにアップロードします。

分かりやすいように新規でpythonという名前のフォルダを作って、上のコードをhello1.pyという名前で保存します。

コードの解説

簡単にコードの解説をします。

1行目は、Pythonのパスを表しています。

レンタルサーバーによってはここが異なる場合があるので、その場合はレンタルサーバーでPythonのパスを調べて変更してください。

ちなみにエックスサーバーの場合は、このままで大丈夫です。

次に2行目ですが、これは文字コードを指定しています。特にこだわりがなければこのままで大丈夫です。

4行目は、HTMLファイルを出力するためのおまじないだと思っていただいて大丈夫です。

PythonでHTMLを出力する場合には必ずこの1行を入れてください。

最後の改行(\n)を忘れないように注意してください。

日本語キーボードの場合はバックスラッシュ(\)の代わりに円記号(¥)を入力して下さい。

5行目がいよいよ出力表示する部分です。

この例だと、Hello, World!と表示されます。

今回のスクリプトは以上です。

簡単ですよね。

サーバーへのアップロードとサーバーの設定

サーバーに先ほど作ったpythonというフォルダとhello1.pyというファイルをアップロードします。

パーミッションを755に変更

アップロードしたら、pythonスクリプトが動くように、hello1.pyのパーミッション(権限の設定)を755に変更しましょう。

パーミッション755

.pyをCGIスクリプトとして動かす

次に、.pyという拡張子のファイルをCGIファイルとして動かすために、.htaccessファイルを少し編集します。

一番上の階層に.htaccessファイルがあると思いますので、それに以下の2行を追加します。.htaccessファイルがない場合は作成しましょう。


Options +ExecCGI
AddType application/x-httpd-cgi .py

エックスサーバーの場合は管理画面から簡単に編集できます。

下の画像の赤枠の部分に.htaccess編集があります。

エックスサーバー

それをクリックして、.htaccess編集タブを開いて、さっきの2行を追加して保存するだけです。

これで、.pyという拡張子のファイルをCGIファイルとして動かす準備ができました。

動作確認

それでは、早速動作を確認してみましょう。

先ほど、アップロードしたhello1.pyファイルにアクセスします。

私の場合は、以下のurlになります。

https://www.atlantacomedyscene.com/python/hello1.py

どうでしょう?

Hello, World!と表示されたはずです。

おめでとうございます。

これで、PythonスクリプトをWebサーバー上で動かすことができるようになりました。

正しくHTMLを出力しよう!

Hello, World!とうまく表示できたのですが、HTMLソースを見ると、Hello, World!とだけ表示されていて、HTMLファイルになっていませんよね。

先ほどのhello1.pyを、正しいHTMLファイルになるように少し修正しましょう。

以下のコードを入力して、hello2.pyという名前で保存して下さい。

#!/usr/bin/python
# -*- coding: utf-8 -*-

print ("Content-Type: text/html\n\n")
print ("<!doctype html>")
print ("<html>")
print ("<head>")
print ("<meta charset=\"UTF-8\">")
print ("<title>Hello, World!</title>")
print ("</head>")
print ("<body>")
print ("<h1>これはPythonの動作テストです。</h1>")
print ("<p>Hello World!</p>")
print ("</body>")
print ("</html>")

少し複雑になりましたが、よく見るとHTMLタグを記述しているだけなので、特に難しいことはありませんよね。

1点だけ注意が必要です。

それは、8行目です。

“UTF-8″という部分がありますよね。ダブルクォーテーションで囲まれています。

Pythonのprint文も出力したい部分をダブルクォーテーションで囲むというルールがあって、そのままではそれと干渉してしまいます。

そこで、UTF-8の前後にあるダブルクォーテーションの前にバックスラッシュまたは¥を入れてダブルクォーテーションをエスケープしています。

このエスケープをしないときちんと表示されないので注意して下さい。

サーバーにアップロードして表示を確認

hello2.pyという名前で保存できたら、サーバーにアップロードして、再度パーミッションを755に変更して表示を確認しましょう。

うまくいってれば、「これはPythonの動作テストです。Hello World!」と表示されるはずです。

私の場合は、以下のurlになります。

https://www.atlantacomedyscene.com/python/hello2.py

HTMLソースを確認すると以下のようになっていて、正しくHTMLが表示されていると思います。

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Hello, World!</title>
</head>
<body>
<h1>これはPythonの動作テストです。</h1>
<p>Hello World!</p>
</body>
</html>

無事に表示できたでしょうか?

これで、PythonスクリプトをWebサーバーで動かすことができました。

もし、エラーになる場合には、以下の2行のコードを追加するとエラーの原因が表示されます。


import cgitb
cgitb.enable()

全体のコードはこのようになります。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import cgitb
cgitb.enable()

print ("Content-Type: text/html\n\n")
print ("<!doctype html>")
print ("<html>")
print ("<head>")
print ("<meta charset=\"UTF-8\">")
print ("<title>Hello, World!</title>")
print ("</head>")
print ("<body>")
print ("<h1>これはPythonの動作テストです。</h1>")
print ("<p>Hello World!</p>")
print ("</body>")
print ("</html>")

まとめ

うまくHTMLが表示できたら、色々とHTMLタグを変更してうまく表示されるかどうかを試して見て下さい。

作ったサンプルファイルを自分で色々と改造して、自分が思った通りに動くかどうか確認するのはとても勉強になります。

今回はここまでにしたいと思います。

これでWebサーバーで動かすことができるようになったので、あとはPythonの文法を覚えていけば、どんどん複雑なプログラムをWebサーバー上で動かすことができるようになりますので楽しみにしておいて下さいね。

もし、うまく動かないという場合や質問などがあればお気軽にコメントに書き込んで下さい。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

コメント

  1. ゆーしー より:

    初めまして。
    pythonを始めて2~3カ月ほどの者です。ゆーしーと申します。
    最近躓いていることがあり、質問させていただきました。
    (1カ月程調べたり試行錯誤しても全然解決できず困り果てております。汗)
    もし可能でしたらご回答いただければ大変ありがたく存じます。

    【やりたいこと】
    pythonで記述したコードをwebサーバー上で定期実行したい。
    具体的には、webスクレイピング(SNSいいね自動化)について、レンタルサーバーconoohaWingのサーバー上で定時で自動実行するようにしたい。
    完全放置で自動化したい。

    【現状】
    ・いいねのスクリプトは準備できておりまして、ローカル上で実行可能な状況です。
    ・ブログ用にconohaWingのサーバーを借りていますので、こちらで定期実行できるのではと考えました。
    ・色々調べたところ、conohaWingにSSH接続すればできるのでは?といった方針になっています。
    <環境>
    環境は、ローカルにanaconda内で仮想環境を作ってVScodeでコード実装しています。
    conda version : 4.10.3
    python version : 3.8.8.final.0
    OS:Windows8

    【疑問点】
    ・そんな中で主様のの記事を拝見したのですが、これは上記の趣旨でも使える手法でしょうか?
    https://www.sigmadesign.co.jp/python/python-fundamental/post-25/
    ・anaconda環境でも手順は同じでしょうか?

    大変お手数をかけいたしますが、ご確認の程よろしくお願いいたします。

    • sigmadesign より:

      ゆーしーさん。こんにちは。
      はい。サーバーで動かすのは同じようできると思います。
      サーバーで動かす事ができれば、あとはcronで定期的に自動実行させればいいだけですね。