所以我通过这样做在端口8000上的Ubuntu盒子上创建了一个简单的服务器:
python -m SimpleHTTPServer
10.127.11.18 - - [14/Aug/2014 15:11:55] "GET / HTTP/1.1" 200 -
10.127.11.18 - - [14/Aug/2014 15:11:55] code 404, message File not found
10.127.11.18 - - [14/Aug/2014 15:11:55] "GET /favicon.ico HTTP/1.1" 404 -
10.127.11.18 - - [14/Aug/2014 15:12:02] "GET /crazysean/ HTTP/1.1" 200 -
10.127.11.18 - - [14/Aug/2014 15:12:37] "GET /crazysean/ HTTP/1.1" 200 -
10.127.11.18 - - [14/Aug/2014 15:12:52] "GET /crazysean/?url=www.google.com&x=200&y=400 HTTP/1.1" 301 -
10.127.11.18 - - [14/Aug/2014 15:12:52] "GET /crazysean/?url=www.google.com&x=200&y=400/ HTTP/1.1" 200 -
10.127.11.18 - - [14/Aug/2014 15:13:10] "GET /crazysean/?url=www.google.com&x=200&y=400/ HTTP/1.1" 200 -
我正在尝试解析发送的GET
数据,例如网址,x位置和y位置。
我认为我的第一步应该是创建一个新脚本:
import SimpleHTTPServer
import SocketServer
PORT = 8000
Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
httpd = SocketServer.TCPServer(("", PORT), Handler)
print "serving at port", PORT
httpd.serve_forever()
但我不确定如何修改此脚本以捕获GET
数据,因为最终我想将数据转储到sqlite3数据库中。
答案 0 :(得分:3)
我认为这是一个XY问题。您没有兴趣解析GET请求或对日志执行任何操作;你想要的是“捕获GET数据”,与SimpleHTTPServer
使用该数据为请求提供服务的方式完全相同,因此您可以将其存储在数据库中。而你只是认为唯一的方法是解析某些东西,某处,但你不确定是什么。
显然,SimpleHTTPServer
必须已经在解析GET
数据,并且必须具备您想要的数据。那么,它在哪里?
正如the docs在顶部说的那样:
许多工作(例如解析请求)由基类
BaseHTTPServer.BaseHTTPRequestHandler
完成。此类实现do_GET()
和do_HEAD()
函数。
关注该链接,您会看到:
处理程序将解析请求和标头,然后调用特定于请求类型的方法。方法名称是根据请求构造的。例如,对于请求方法
SPAM
,将调用do_SPAM()
方法,不带参数。所有相关信息都存储在处理程序的实例变量中......
所以,所有内容都被解析为实例变量;在下面的那段下面有一个很好的列表。
所以:
class DBLoggingHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
def __init__(self, *args, **kwargs):
super(DBLoggingHandler, self).__init__(*args, **kwargs)
self.db = sqlite3.connect(dbpath)
def do_GET(self):
self.db.execute("INSERT INTO GetLog (command, vers, path) VALUES (?, ?, ?)",
(self.command, self.request_version, self.path))
return super(DBLoggingHandler, self).do_GET()
如果您要将path
解析为单独的组件,可以使用urlparse
:
def do_GET(self):
bits = urlparse.urlpase(self.path)
self.db.execute("""INSERT INTO GetLog (command, vers, scheme, netloc,
path, params, query, fragment,
username, password, hostname, port)
VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
(self.command, self.request_version, bits.scheme, bits.netloc,
bits.path, bits.params, bits.query, bits.fragment,
bits.username, bits.password, bits.hostname, bits.port))
return super(DBLoggingHandler, self).do_GET()
另外,请记住请求不仅仅是命令行;他们通常有标题,他们可能有一个身体(虽然通常不是GET
)。请参阅headers
和rfile
。对于不属于HTTP请求的信息,但是套接字连接的一部分,或者有关服务器的信息等,也有相应的属性。