#python #cgi
#python #cgi
Вопрос:
Я никогда раньше не настраивал сервер (не говоря уже о сервере python), и я немного растерялся. Как мне использовать следующий код? Я попытался вставить в каталог cgi bin, но это не сработало. Он вернул внутреннюю ошибку сервера. посмотрите на это здесь
#!/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 <Ctrl-C> to stop'
httpd.serve_forever()
Комментарии:
1. Вам предстоит пройти долгий путь, и это на самом деле не вопрос. Я ожидаю, что он будет закрыт в ближайшее время. Взгляните на документы funf. Взгляните на документы python. Разбирайтесь в сценариях Linux.
2. Другими словами, джорребор, ты спрашиваешь, как водить машину, и показываешь нам, что ты не знаешь, что такое автомобиль. CGI-скрипт генерирует вывод в стандартный out, который отправляется вашим веб-сервером вам в виде веб-страницы. Приведенный выше код создает долговременный демонический (серверный) процесс на python и предназначен не для запуска в среде CGI, а скорее как автономный http-сервер. CGI-скрипты не содержат службы HTTP-сервера, а скорее выполняются внутри другого сервера (например, Apache или IIS). Я не голосовал за закрытие и не рекомендую голосовать за закрытие. Я рекомендую попытаться помочь этому потерянному новичку.
Ответ №1:
Если вы хотите запустить CGI на чем-то вроде Apache (в отличие от пользовательского кода сервера, подобного тому, который вы вставили выше), вы можете создать файл .py, подобный этому, в каталоге (.py) с поддержкой CGI.
#!/usr/bin/env python
print "Content-Type: text/html"
print
print 'Hello World'
Если вы используете Apache, вот некоторая информация о том, как настроить исполняемые файлы CGI.
редактировать: (Как говорит Адриан П., скрипт Python должен быть выполнен в исполняемом виде.)
Комментарии:
1. Это хороший ответ, показывающий минимальную программу hello world «cgi script». Пример кода, опубликованный OP, не подходит для использования в качестве CGI-скрипта. Шаг 1: настройте свой веб-сервер и убедитесь, что Python установлен и доступен для CGI. См. Эту ссылку для получения некоторой справки по настройке Linux: my.opera.com/NoteMe/blog /…
Ответ №2:
Вам не нужно помещать его в каталог cgi-bin.
Если вы используете Windows, вы можете запустить Idle из меню «Пуск» под пунктом python. Вставьте код и нажмите клавишу F5, чтобы запустить код.
Если вы используете *nix, посмотрите ответ Адриана на команды и скопируйте то, что выводится при запуске. /your_script.py .
Вы пытаетесь запрограммировать веб-сайт на Python? Это код для создания веб-сервера, а не сайта, поэтому переход к программе в веб-браузере не даст никаких результатов.
Ответ №3:
$ chmod x your_script.py
$ ./your_script.py
Быстрый взгляд на ваш код: он запускает простой http-сервер, который прослушивает порт 8000
Комментарии:
1. Ой. Итак, он хочет запустить вещь, которая является демоном (сервисом), как если бы это была страница cgi.
Ответ №4:
Heroku — хорошее место для размещения скриптов и скриптов на Python.
Предварительный запрос
pythonscripts.py
procfile
requirements.txt
и после добавления, фиксации и отправки скриптов в приложение heroku. Просто запустите следующую команду на терминале, чтобы запустить скрипты.
heroku run python your_scripts.py
Подробнее, если вы хотите запускать эти скрипты по расписанию. затем heroku предоставляет множество дополнений. просто найдите его на heroku