2016-01-21 39 views
3

Я хотел бы написать Python скрипт, который будет:Python: запустить SimpleHTTPServer и сделать запрос на него в сценарии

  1. Start SimpleHTTPServer на некоторый порт
  2. Сделать запрос на сервер и отправить некоторые данные по POST
  3. Запуск сценария с помощью оболочки в интерактивном режиме и взаимодействовать с ним

Сейчас код выглядит следующим образом:

import SimpleHTTPServer 
import SocketServer 
import urllib 
import urllib2 

# Variables 
URL = 'localhost:8000' 
PORT = 8000 

# Setup simple sever 
Handler = SimpleHTTPServer.SimpleHTTPRequestHandler 
httpd = SocketServer.TCPServer(("", PORT), Handler) 
print "serving at port", PORT 
httpd.serve_forever() 

# Getting HTML from the target page 
values = { 
    'name': 'Thomas Anderson', 
    'location': 'unknown' 
} 
data = urlilib.urlencode(values) 
req = urllib2.Request(url, data) 
response = urllib2.urlopen(req) 
html = response.read() 

Проблема заключается в том, что когда я бегу мой сценарий

python -i foo.py 

serving at port 8000 Он печатает, а затем замерзает. Бьюсь об заклад, это что-то тривиальное для гуру Python здесь, но помощь будет оценена.

ответ

3

Запустите сервер как другой процесс, который позволит вам запустить остальную часть вашего скрипта.

Я бы предпочел использовать requests, чем urllib.

import SocketServer 
import SimpleHTTPServer 

import requests 
import multiprocessing 

# Variables 
PORT = 8000 
URL = 'localhost:{port}'.format(port=PORT) 

# Setup simple sever 
Handler = SimpleHTTPServer.SimpleHTTPRequestHandler 
httpd = SocketServer.TCPServer(("", PORT), Handler) 
print "Serving at port", PORT 

# start the server as a separate process 
server_process = multiprocessing.Process(target=httpd.serve_forever) 
server_process.daemon = True 
server_process.start() 

# Getting HTML from the target page 
values = { 
    'name': 'Thomas Anderson', 
    'location': 'unknown' 
} 

r = requests.post(URL, data=values) 
r.text 

# stop the server 
server_process.terminate() 
+1

Спасибо, это то, что я искал, но не мог получить из-за предела питон-опыта. – Oleg

+0

Одна вещь, которую я заметил, является ошибкой при попытке выполнить это: socket.error: [Errno 10048] Только одно использование каждого адреса сокета (протокол/сетевой адрес/порт) обычно разрешает ted – Oleg

+0

Это, скорее всего, из-за того, что вы не закрываете свой http-сервер, по крайней мере, в вашем примере. Пожалуйста, см. Мой ответ для более подробной информации. –

4

В качестве альтернативы запустить его в отдельном thread:

import SimpleHTTPServer 
import SocketServer 
import urllib2 
from threading import Thread 
from datetime import time 

# Variables 
URL = 'localhost:8000' 
PORT = 8000 

# Setup simple sever 
Handler = SimpleHTTPServer.SimpleHTTPRequestHandler 
httpd = SocketServer.TCPServer(("", PORT), Handler) 
print "serving at port", PORT 
def simple_sever(): 
    httpd.serve_forever() 

simple_sever_T = Thread(target=simple_sever, name='simple_sever') 
simple_sever_T.daemon = True 
simple_sever_T.start() 

while not simple_sever_T.is_alive(): 
    time.sleep(1) 

# Getting test file 
req = urllib2.Request('http://localhost:%s/test_file' % PORT) 
response = urllib2.urlopen(req) 
print response.read() 
httpd.shutdown()