Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从SimpleHTTPServer解析GET请求数据_Python_Simplehttpserver - Fatal编程技术网

Python 从SimpleHTTPServer解析GET请求数据

Python 从SimpleHTTPServer解析GET请求数据,python,simplehttpserver,Python,Simplehttpserver,因此,我在端口8000的Ubuntu盒上创建了一个简单的服务器: python-msimplehttpserver 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.ic

因此,我在端口8000的Ubuntu盒上创建了一个简单的服务器:

python-msimplehttpserver

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
数据,比如URL、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数据库中。

我认为这是一个XY问题。您对解析GET请求或对日志执行任何操作都不感兴趣;您想要的是“捕获GET数据”,其方式与
SimpleHTTPServer
使用该数据为请求提供服务的方式完全相同,因此您可以将其存储在数据库中。你只是认为唯一的方法就是在某个地方解析一些东西,但你不确定是什么

显然,
SimpleHTTPServer
必须已经在解析
GET
数据,并且必须具有您想要的可用数据。那么,它在哪里

正如上面所说:

很多工作,比如解析请求,都是由基类完成的。此类实现了
do\u GET()
do\u HEAD()
函数

点击该链接,您将看到:

处理程序将解析请求和头,然后调用特定于请求类型的方法。方法名是根据请求构造的。例如,对于请求方法
SPAM
,调用
do\u SPAM()
方法时将不带参数。所有相关信息都存储在处理程序的实例变量中

所以,一切都被解析为实例变量;下面那一段下面有一个很好的列表

因此:

如果要将
路径
解析为单独的组件,可以使用:

    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
)。请参见
标题
rfile
。对于不是HTTP请求的一部分,而是套接字连接的一部分的信息,或者关于服务器的信息等,也有相应的属性。

我认为这是一个XY问题。您对解析GET请求或对日志执行任何操作都不感兴趣;您想要的是“捕获GET数据”,其方式与
SimpleHTTPServer
使用该数据为请求提供服务的方式完全相同,因此您可以将其存储在数据库中。你只是认为唯一的方法就是在某个地方解析一些东西,但你不确定是什么

显然,
SimpleHTTPServer
必须已经在解析
GET
数据,并且必须具有您想要的可用数据。那么,它在哪里

正如上面所说:

很多工作,比如解析请求,都是由基类完成的。此类实现了
do\u GET()
do\u HEAD()
函数

点击该链接,您将看到:

处理程序将解析请求和头,然后调用特定于请求类型的方法。方法名是根据请求构造的。例如,对于请求方法
SPAM
,调用
do\u SPAM()
方法时将不带参数。所有相关信息都存储在处理程序的实例变量中

所以,一切都被解析为实例变量;下面那一段下面有一个很好的列表

因此:

如果要将
路径
解析为单独的组件,可以使用:

    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
)。请参见
标题
rfile
。对于不是HTTP请求的一部分,而是套接字连接的一部分的信息,或者关于服务器的信息,等等。,这也有一些属性。

你是想保存解析后的日志还是想做其他事情?@slipjack保存日志应该是一个很好的开始。@slipjack我想更好的方法是在请求传入时解析
获取
请求。使用更高的像flask这样的级别库。实际的命令是
GET HTTP/1.1/frackysean/?url=www.google.com&x=200&y=400
。您可以通过对处理程序进行子类化来获得这些信息。如果您想要其余的日志信息,比如301,那不是请求的一部分;这就是处理程序对请求所做的解释。您是在试图保存解析后的日志,还是在尝试做其他事情?@slipjack保存日志将是一个很好的开始,我想@slipjack我想更好的方法是在请求传入时解析
GET
请求。您会受益匪浅从使用更高级别的库(如flask)开始。实际的命令(如
GET HTTP/1.1/crazysean/?url=www.google.com&x=200&y=400
)。您可以通过对处理程序进行子类化来获得这些信息。如果您想要其余的日志信息,比如301,那不是请求的一部分;这是处理程序对请求所做的解释。这是一个很好的回答,非常感谢。我以前从未上过课,所以我有一些研究要做。这是一个很好的答案,非常感谢。我以前从未上过课,所以我有一些研究要做。