Сегодня мы продемонстрируем как создать простой сервер на Python, используя библиотеку BaseHTTPServer.
Наш сервер будет способен принимать, как GET-запросы для отображения страниц, так и POST-запросы для отправки файлов через форму.
Если файл, запрашиваемый через GET-запрос, будет найден на сервере, то сервер будет посылать браузеру код 200 OK. Если файл не будет найден сервером, то он пошлет код 404 Not found.
При успешно получении файла сервером через POST-запрос сервер пошлет браузеру код 301.
Давайте посмотрим на код нашего сервера и вспомогательных файлов.
Файл webserver.py
import string,cgi,time
from os import curdir, sep
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
#import pri
class MyHandler(BaseHTTPRequestHandler):
def do_GET(self):
try:
if self.path.endswith(".html"):
f = open(curdir + sep + self.path) #self.path has /test.html
#note that this potentially makes every file on your computer readable by the internet
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
self.wfile.write(f.read())
f.close()
return
if self.path.endswith(".esp"): #our dynamic content
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
self.wfile.write("hey, today is the" + str(time.localtime()[7]))
self.wfile.write(" day in the year " + str(time.localtime()[0]))
return
return
except IOError:
self.send_error(404,'File Not Found: %s' % self.path)
def do_POST(self):
global rootnode
try:
ctype, pdict = cgi.parse_header(self.headers.getheader('content-type'))
if ctype == 'multipart/form-data':
query=cgi.parse_multipart(self.rfile, pdict)
self.send_response(301)
self.end_headers()
upfilecontent = query.get('upfile')
print "filecontent", upfilecontent[0]
self.wfile.write("<HTML>POST OK.<BR><BR>");
self.wfile.write(upfilecontent[0]);
except :
pass
def main():
try:
server = HTTPServer(('', 80), MyHandler)
print 'started httpserver...'
server.serve_forever()
except KeyboardInterrupt:
print '^C received, shutting down server'
server.socket.close()
if __name__ == '__main__':
main()
Файл index.html
<html>
This is a simple HTML page.
</html>
Файл upload.html
<html>
<body>
<form method="post" enctype="multipart/form-data" action="http://127.0.0.1/">
File to upload: <input type="file" name="upfile">
<br />
<br />
<input type="submit" value="Press"> to upload the file!
</form>
</body>
</html>
Функция main() пытается запустить сервер на порту 80. Для завершения работы сервера вы можете зажать Ctrl + C, находясь в консоли. В этом случае сервер закроет сокет соединения с браузером и выйдет из программы.
Метод do_GET() запускается когда браузер посылает GET-запрос. Он проверяет тип запрашиваемого браузером файла. Если запрашивается HTML-файл, то метод пытается открыть его, прочитать его содержимое и отправить это содержимое браузеру. Если, тип файла exp, то браузеру будет просто посланы текущий день и год.
Метод do_POST() запускается когда браузер посылает POST-запрос. Он отображает содержимое загруженного файла. Имя файла прописано как "upfile".
Запускаем пример сервера.
В консоли набираем:
python webserver.py
Затем запускаем любой браузер и переходим по адресу
http://localhost/index.html
или
http://localhost/index.esp
Для тестирования загрузки файла на сервер вы должны перейти по адресу:
http://localhost/upload.html
После этого на странице нажмите на кнопку "browse", выберите любой небольшой текстовый файл и нажмите на кнопку "press". После этого сервер отобразит в браузере содержимое выбранного файла.
Комментариев нет:
Отправить комментарий