2013-04-04 2 views
3

Я нашел веб-сервер HTTP питона из http://www.linuxjournal.com/content/tech-tip-really-simple-http-server-pythonКак отправить строку html с веб-сервера python http?

import sys 
import BaseHTTPServer 
from SimpleHTTPServer import SimpleHTTPRequestHandler 


HandlerClass = SimpleHTTPRequestHandler 
ServerClass = BaseHTTPServer.HTTPServer 
Protocol  = "HTTP/1.0" 

if sys.argv[1:]: 
    port = int(sys.argv[1]) 
else: 
    port = 8000 
server_address = ('127.0.0.1', port) 

HandlerClass.protocol_version = Protocol 
httpd = ServerClass(server_address, HandlerClass) 

sa = httpd.socket.getsockname() 
print "Serving HTTP on", sa[0], "port", sa[1], "..." 
httpd.serve_forever() 

Если каталог содержит файл с именем index.html, этот файл будет подан в качестве исходного файла. Если index.html отсутствует, будут указаны файлы в каталоге.

Как мне изменить сценарий, чтобы отправить пользовательский html в браузер?

+1

Зачем вам это нужно? Apache и Nginx существуют по какой-то причине. SimpleHTTPServer - полная реализация игрушек, она не подходит ни для чего, на самом деле. –

+0

@TylerEaves Я хочу выполнить команду как root на сервере и отобразить ее результаты в браузере. – Mika

+0

Голова для минимальной рамки, как фляжка. –

ответ

4

В качестве названия и документации подразумевается, что SimpleHTTPServer является мертвым и предназначен для использования в качестве образца кода для создания собственных серверов поверх фреймворков в стандартной библиотеке.

Итак, если вы хотите что-то сделать с этим, вы, вероятно, захотите скопировать и изменить the source или просто использовать его как вдохновение.

И если вы хотите сделать что-нибудь серьезные, вы, вероятно, хотите использовать рамки сделаны для написания реальных серверов HTTP как tornado или twisted, или просто использовать сервер акций HTTP и делегировать динамические страницы в Python через, скажем, , WSGI.

Но если вы действительно этого хотите, можете. Ничто не мешает вам подклассифицировать SimpleHTTPServer.SimpleHTTPRequestHandler и переопределять его методы. Например:

class MyHandler(SimpleHTTPRequestHandler): 
    def send_head(self): 
     if self.translate_path(self.path).endswith('/foo'): 
      body = gaping_security_hole(self.path) 
      self.send_response(200) 
      self.send_header("Content-type", "text/html; charset=utf-8") 
      self.send_header("Content-Length", str(len(body))) 
      self.end_headers() 
      return StringIO(body) 
     else: 
      return super(MyHandler, self).send_head() 

Очевидно, что вы можете проверить все, что вы хотите там вместо endswith('/foo'). Например, как вы можете видеть из the source, реализация по умолчанию проверяет os.path.isdir, и если это правда, проверяет, имеет ли она endswith('/'), и имеет ли в каталоге что-либо имя index.html или index.htm, прежде чем принимать решение о том, что делать.

+0

Я не могу получить это для init 'Handler = MyHandler() TypeError: __init __() принимает ровно 4 аргумента (1 данный) ' –

Смежные вопросы