簡體   English   中英

從SimpleHTTPServer解析GET請求數據

[英]Parsing GET request data with from SimpleHTTPServer

因此,我通過執行以下操作在端口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數據,例如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 db中。

認為這是一個XY問題。 您沒有興趣解析GET請求或對日志進行任何操作; 您想要的是“捕獲GET數據”,就像SimpleHTTPServer使用該數據來處理請求一樣,因此您可以將其存儲在數據庫中。 而且您只是想做到這一點的唯一方法是在某處解析某些內容 ,但是您不確定該怎么做。

顯然, SimpleHTTPServer必須已經在解析GET數據,並且必須完全具有您想要的內容。 那么,它在哪里?

正如文檔在頂部所說的那樣:

基類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 )。 參見headersrfile 對於不是HTTP請求的一部分,而是套接字連接的一部分的信息,或有關服務器的信息等,也有相應的屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM