web-dev-qa-db-ja.com

Python:SimpleHTTPServerを実行し、スクリプトでリクエストします

Pythonスクリプトを書きたいと思います:

  1. いくつかのポートで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の達人にとっては些細なことだと思いますが、助けていただければ幸いです。

5
0leg

サーバーを別のプロセスとして実行します。これにより、スクリプトの残りの部分を実行できるようになります。

また、urllibよりも requests を使用したいと思います。

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()
4
Dušan Maďar

または、別の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()
4
NarūnasK