Python CGI betiği nasıl çalıştırılır

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
Başka bir deyişle, jorrebor, bir araba sürmeyi ve bize bir aracın ne olduğunu bilmediğinizi göstermeyi istiyorsun. Bir CGI betiği, web sunucunuz tarafından size bir web sayfası olarak gönderilen standart çıktı üretir. Yukarıdaki kod, python'da uzun ömürlü bir sunucu (sunucu) süreci oluşturur ve bir CGI ortamında değil, bağımsız bir http sunucusu olarak çalıştırılmak üzere tasarlanmamıştır. CGI komut dosyaları bir HTTP sunucusu hizmeti içermez, bunun yerine başka bir sunucuda (Apache veya IIS gibi) çalışır. Kapatmak için oy kullanmadım ve oylamayı kapatma önerisinde bulunmadım. Bu kayıp noob'a yardım etmeyi tavsiye ederim.
katma yazar Warren P, kaynak
Gitmen uzun bir yolun var ve bu gerçekten bir soru değil. Kısa sürede kapatılmasını beklerdim. Eğlenceli doktorlara bir bakın. Python dokümanlarına bir göz atın. Linux komut dosyalarını anlama.
katma yazar mbrownnyc, kaynak

4 cevap

Bir CGI'yı Apache gibi bir şey üzerinde çalıştırmak istiyorsanız (yukarıda yapıştırdığınız gibi özel sunucu koduyla karşıt olarak), (.py) CGI etkinleştirilmiş bir dizinde bunun gibi bir .py dosyası oluşturabilirsiniz.

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

Apache kullanıyorsanız, burada CGI yürütücülerinin nasıl ayarlanacağı hakkında bazı bilgiler .

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

5
katma
Bu minimal merhaba dünya "cgi script" programını gösteren iyi bir cevaptır. OP tarafından yayınlanan örnek kod, bir CGI betiği olarak kullanılmaya uygun değildir. 1. Adım, web sunucunuzu kurun ve Python'un yüklü ve CGI'ya uygun olduğundan emin olun. Bazı linux kurulum yardımları için bu bağlantıya bakın: my.opera.com/NoteMe/blog/…
katma yazar Warren P, kaynak
$ chmod +x your_script.py
$ ./your_script.py

Kodunuza hızlıca bakın: bağlantı noktası 8000'i dinleyen basit bir http sunucusu başlatın.

1
katma
Ahh. Bu yüzden bir cgi sayfası gibi bir şey (hizmet) olan bir şey çalıştırmak istiyor.
katma yazar Warren P, kaynak

Heroku, ev sahibi ve python betikleri için iyi bir yerdir.

Ön req

pythonscripts.py
procfile
requirements.txt

ve Ekledikten sonra, senaryoları kahramanca uygulamasına itin ve itin. Sadece komut dosyalarını çalıştırmak için terminalde aşağıdaki komutu çalıştırın.

heroku run python your_scripts.py

Bu komut dosyalarını program zamanlaması üzerinde çalıştırmak isterseniz daha fazla bilgi edinin. o zaman heroku pek çok katkı sağlar. sadece heroku'da ara

0
katma

Bir cgi-bin dizinine yerleştirmek zorunda değilsiniz.

Pencereleri çalıştırıyorsanız, başlangıç ​​menüsünüzden python girdisi altında Boşta'yı başlatabilirsiniz. Kodu yapıştırın ve kodu çalıştırmak için F5 tuşuna basın.

Eğer * nix'i çalıştırıyorsanız, komutlar için Adrien'nin cevabına bakın ve ./your_script.py.

Python'da bir web sitesi programlamaya çalışıyor musunuz? Bu, site değil, web sunucusu oluşturmak için bir koddur, böylece bir web tarayıcısında programa gitmek hiçbir sonuç vermez.

0
katma