Python CGIスクリプトの実行方法

I have never setup a server (let alone a python server) before and i am a bit lost. How do i utilize the following code? I have tried to put in in the cgi bin directory but that didnt work. It returned an internal server error. have a look at this here

#!/usr/bin/env python
#
# Funf: Open Sensing Framework
# Copyright (C) 2010-2011 Nadav Aharony, Wei Pan, Alex Pentland.
# Acknowledgments: Alan Gardner


from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
from SocketServer import ThreadingMixIn
import sys
import cgi
import urlparse
import os.path
import shutil
import time

server_dir = os.path.dirname(__file__)

config_path = '/config'
config_file_path = os.path.join(server_dir, 'config.json')

upload_path = '/data'
upload_dir = os.path.join(server_dir, 'uploads')

def read_config():
    config = None
    try:
        with open(config_file_path) as config_file:
            config = config_file.read()
    except IOError:
        pass
    return config

def backup_file(filepath):
    shutil.move(filepath, filepath + '.' + str(int(time.time()*1000)) + '.bak')

def write_file(filename, file):
    if not os.path.exists(upload_dir):
        os.mkdir(upload_dir)
    filepath = os.path.join(upload_dir, filename)
    if os.path.exists(filepath):
        backup_file(filepath)
    with open(filepath, 'wb') as output_file:
        while True:
            chunk = file.read(1024)
            if not chunk:
                break
            output_file.write(chunk)

class RequestHandler(BaseHTTPRequestHandler):

    def do_GET(self):
        parsed_url = urlparse.urlparse(self.path)
        if parsed_url.path == config_path:
            config = read_config()
            if config:
                self.send_response(200)
                self.end_headers()
                self.wfile.write(config)
            else:
                self.send_error(500)
        elif parsed_url.path == upload_path:
            self.send_error(405)
        else:
            self.send_error(404)

    def do_POST(self):
        parsed_url = urlparse.urlparse(self.path)
        path = parsed_url.path
        ctype, pdict = cgi.parse_header(self.headers['Content-Type']) 
        if path == upload_path:
            if ctype=='multipart/form-data':
                form = cgi.FieldStorage(self.rfile, self.headers, environ={'REQUEST_METHOD':'POST'})
                try:
                    fileitem = form["uploadedfile"]
                    if fileitem.file:
                        try:
                            write_file(fileitem.filename, fileitem.file)
                        except Exception as e:
                            print e
                            self.send_error(500)
                        else:
                            self.send_response(200)
                            self.end_headers()
                            self.wfile.write("OK")
                        return
                except KeyError:
                    pass
            # Bad request
            self.send_error(400)
        elif parsed_url.path == config_path:
            self.send_error(405)
        else:
            self.send_error(404)


class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
    """Handle requests in a separate thread."""                


if __name__ == '__main__':
    if sys.argv[1:]:
        port = int(sys.argv[1])
    else:
        port = 8000
    server_address = ('', port)
    httpd = ThreadedHTTPServer(server_address, RequestHandler)

    sa = httpd.socket.getsockname()
    print "Serving HTTP on", sa[0], "port", sa[1], "..."
    print 'use  to stop'
    httpd.serve_forever()
2
言い換えれば、ジョーレボルは、車を運転する方法を尋ねており、車が何であるかわからないことを私たちに示しています。 CGIスクリプトは、WebサーバーからWebページとしてあなたに送信される標準出力に出力を生成します。上記のコードは、Pythonで長いデーモン(サーバー)プロセスを作成し、CGI環境ではなくスタンドアロンのhttpサーバーとして実行することを目的としています。 CGIスクリプトにはHTTPサーバーサービスは含まれていませんが、ApacheやIISなどの別のサーバーで実行されます。私は閉会に投票しておらず、閉会投票をお勧めしません。私はこの失われたnoobを助けることをお勧めします。
追加された 著者 Warren P,
あなたは長い道のりがあります、そして、これは本当に質問ではありません。まもなく閉鎖されると思います。 funfのドキュメントを見てください。 Pythonのドキュメントを見てください。 Linuxのスクリプトを理解する。
追加された 著者 mbrownnyc,

4 答え

ApacheのようなものでCGIを実行したい場合(上に貼り付けたようなカスタムサーバーコードではなく)、(.py)CGI対応のディレクトリに.pyファイルを作成できます。

#!/usr/bin/env python
print "Content-Type: text/html"
print
print 'Hello World'

Apacheを使用している場合、 CGI実行ファイルを設定する方法についての情報があります。 a>。

edit: (As Adrien P. says, the Python script should be made executable.)

これは、最小のこんにちは世界 "cgiスクリプト"プログラムを示す良い答えです。 OPによって投稿されたサンプルコードは、CGIスクリプトとしての使用には適していません。ステップ1 Webサーバーをセットアップし、Pythonがインストールされ、CGIで使用できることを確認します。いくつかのLinuxセットアップヘルプについては、このリンクをご覧ください: my.opera.com/NoteMe/blog/…
追加された 著者 Warren P,
$ chmod +x your_script.py
$ ./your_script.py

あなたのコードをすばやく見る:ポート8000​​でリッスンする簡単なhttpサーバを起動する

1
追加された
ああ。だから、彼はcgiページのようにデーモン(サービス)であるものを動かしたいと思っています。
追加された 著者 Warren P,

HerokuはホストスクリプトとPythonスクリプトに適しています。

前提条件

pythonscripts.py
procfile
requirements.txt

and heroku appにスクリプトを追加してコミットしてプッシュします。ターミナルで次のコマンドを実行してスクリプトを実行してください。

heroku run python your_scripts.py

このスクリプトをスケジュールのタイミングで実行したい場合は、さらに詳しく説明します。 herokuは多くのアドオンを提供します。英雄で検索するだけ

0
追加された

これをcgi-binディレクトリに置く必要はありません。

ウィンドウを実行している場合は、スタートメニューからPythonエントリの下にあるIdleを起動できます。コードを貼り付け、F5キーを押してコードを実行します。

* nixを実行している場合は、コマンドのAdrienの答えを見て、./your_script.pyを実行したときに出力されるものをコピーしてください。

あなたはPythonでWebサイトをプログラミングしようとしていますか?これはサイトではなくウェブサーバーを作成するためのコードなので、Webブラウザでプログラムに移動すると結果は得られません。

0
追加された