Python:运行SimpleHTTPServer并在脚本中向它发出请求

时间:2016-01-21 19:06:45

标签: python python-2.7 server simplehttpserver

我想编写Python脚本:

  1. 在某个端口上启动SimpleHTTPServer
  2. 向服务器发出请求并通过POST发送一些数据
  3. 以交互方式通过shell运行脚本并与之交互
  4. 现在代码看起来像这样:

    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专家来说是微不足道的,但我们将不胜感激。

2 个答案:

答案 0 :(得分:4)

将服务器作为不同的进程运行,这将允许您运行脚本的其余部分。

我宁愿使用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 :(得分: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()