如何使用 python 的 BaseHTTPServer / SimpleHTTPServer 调试 POST 请求?

2024-01-23

我找到了一个脚本这个网站 http://wiki.python.org/moin/BaseHttpServer用于使用 python 通过命令行运行一个简单的服务器。

我添加了一些print行,因为我想通过命令行打印请求的 GET 和 POST 参数,但我似乎无法让它们显示在任何地方。

如果我只是打印我们的s多变的 (pprint (vars(s)))我最终看到了这个:

{'client_address': ('127.0.0.1', 53373),
 'close_connection': 1,
 'command': 'GET',
 'connection': <socket._socketobject object at 0x10b6560c0>,
 'headers': <mimetools.Message instance at 0x10b689ab8>,
 'path': '/favicon.ico',
 'raw_requestline': 'GET /favicon.ico HTTP/1.1\r\n',
 'request': <socket._socketobject object at 0x10b6560c0>,
 'request_version': 'HTTP/1.1',
 'requestline': 'GET /favicon.ico HTTP/1.1',
 'rfile': <socket._fileobject object at 0x10b6538d0>,
 'server': <BaseHTTPServer.HTTPServer instance at 0x10b6893f8>,
 'wfile': <socket._fileobject object at 0x10b6536d0>}

我尝试然后使用print命令与每个索引,(pprint (vars(s.connection)))但这不起作用。

这是修改后的脚本:

#!/usr/bin/python
import time
import BaseHTTPServer
from pprint import pprint

HOST_NAME = 'localhost' # !!!REMEMBER TO CHANGE THIS!!!
PORT_NUMBER = 9000 # Maybe set this to 9000.


class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
        def do_HEAD(s):
                s.send_response(200)
                s.send_header("Content-type", "text/html")
                s.end_headers()
        def do_GET(s):
                """Respond to a GET request."""
                s.send_response(200)
                s.send_header("Content-type", "text/html")
                s.end_headers()
                s.wfile.write("<html><head><title>Title goes here.</title></head>")
                s.wfile.write("<body><form action='.' method='POST'><input name='x' value='1' /><input type='submit' /></form><p>This is a test.</p>")
                # If someone went to "http://something.somewhere.net/foo/bar/",
                # then s.path equals "/foo/bar/".
                s.wfile.write("<p>GET: You accessed path: %s</p>" % s.path)
                s.wfile.write("</body></html>")
                pprint (vars(s))
        def do_POST(s):
                """Respond to a POST request."""
                s.send_response(200)
                s.send_header("Content-type", "text/html")
                s.end_headers()
                s.wfile.write("<html><head><title>Title goes here.</title></head>")
                s.wfile.write("<body><p>This is a test.</p>")
                s.wfile.write("<body><form action='.' method='POST'><input type='text' name='xxxxxxxxxxxx' value='0000000000000000000000' /><input type='submit' /></form><p>This is a test.</p>")
                # If someone went to "http://something.somewhere.net/foo/bar/",
                # then s.path equals "/foo/bar/".
                s.wfile.write("<p>POST: You accessed path: %s</p>" % s.path)
                s.wfile.write("</body></html>")
                pprint (vars(s))
                pprint (vars(s.connection))
                pprint (vars(s.headers))
                pprint (vars(s.request))
                pprint (vars(s.rfile))
                pprint (vars(s.server))
                pprint (vars(s.wfile))
                pprint (vars(s.fp))
                """pprint (vars(s.request))"""

if __name__ == '__main__':
        server_class = BaseHTTPServer.HTTPServer
        httpd = server_class((HOST_NAME, PORT_NUMBER), MyHandler)
        print time.asctime(), "Server Starts - %s:%s" % (HOST_NAME, PORT_NUMBER)
        try:
                httpd.serve_forever()
        except KeyboardInterrupt:
                pass
        httpd.server_close()
        print time.asctime(), "Server Stops - %s:%s" % (HOST_NAME, PORT_NUMBER)

如何使用简单的脚本打印 POST 和 GET 参数?

通过命令行所需的输出将类似于:

1.0.0.127. - - [03/Oct/2012 16:02:05] "POST / HTTP/1.1" 200 -
foo=1
bar=2
bis=3

这不是很明显,但处理程序在幕后使用套接字。所以你需要从套接字读取原始数据,然后解释它。

Use the urlparse http://docs.python.org/library/urlparse.html module.

  • 在Python 2中,你想要urlparse.parse_qs.
  • 在Python 3中,库被重命名:你想要urllib.parse.parse_qs.

Import urlparse,然后修改你的do_POST像这样的方法:

def do_POST(s):
        """Respond to a POST request."""

        # Extract and print the contents of the POST
        length = int(s.headers['Content-Length'])
        post_data = urlparse.parse_qs(s.rfile.read(length).decode('utf-8'))
        for key, value in post_data.iteritems():
            print "%s=%s" % (key, value)

        s.send_response(200)
        s.send_header("Content-type", "text/html")
        s.end_headers()
        ...

设置一个简单的测试客户端:

#!/usr/bin/env python

import urllib
import urllib2

url = 'http://localhost:9000'
post_dict = {'foo' : 1,
             'bar' : 2,
             'bis' : 3}

params = urllib.urlencode(post_dict)
post_req = urllib2.Request(url)
post_req.add_data(params)

response = urllib2.urlopen(post_req)
response_data = response.read()
response.close()
print response_data

启动服务器,然后运行客户端:

ire@localhost$ python http_server.py 
Wed Oct  3 21:38:51 2012 Server Starts - localhost:9000
foo=[u'1']
bar=[u'2']
bis=[u'3']
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 python 的 BaseHTTPServer / SimpleHTTPServer 调试 POST 请求? 的相关文章

随机推荐

  • Rails:为数据库适配器指定了“mysql2”,但未加载 gem

    显然有一个线程可以解决这个问题 但我已经尝试运行解决方案中给出的那些命令 由于某种原因我仍然遇到同样的错误 I run gem install mysql2 v 0 3 18 其次是bundle install 在我的终端上 然后我通过输入
  • 使用 C# 中的 WebBrowser 控件提交网页表单

    我在 SO 以及一般网络上看到了很多关于这个特定主题的帖子 大多数 如果不是全部 代码如下所示 private void btnSubmit Click object sender RoutedEventArgs e webBrowser1
  • 如何在 Visual Studio 中最好地处理巨大的源代码文件

    我正在开发一个大量使用代码生成的项目 它生成的一些文件包含超过 25 万行代码 VS 2K5 处理得还不错 但 R 4 01 每隔两分钟左右就会抛出一个内存不足异常 将它们拆分为部分类 单独的文件并不是短期内的选择 尽管可能会稍后 有什么聪
  • 观察到包 ID 'build-tools;20.0.0' 位置不一致

    gradlew parallel app assembleDebugTest 当我运行上面的命令时安卓工作室终端我收到此错误 Error并行执行是一个正在孵化的功能 在不一致的位置 sdk build tools android 4 4W
  • STL 中的比较器

    我正在使用 struct minHeap 使用priority queue生成最小堆 并且函数comp使用STL中给出的排序函数以相反的顺序打印数字 现在我的疑问是我不能在函数 sort 中使用 struct minHeap 也不能在pri
  • 使用背景图像自定义 UIBarbuttonitem

    我添加了一个 UIToolbar 实例和其顶部的按钮 每个按钮都属于 UIBarButtonItem 类 我的要求是每个按钮都有一个自定义的布局 我不想使用苹果提供的原生按钮样式 所以我在 Interface Builder 中有 3 个选
  • PIP 安装请求运行时错误:Python 2.7 中超出最大递归深度

    我是 Python 新手 面临以下问题 当我尝试使用命令安装 请求 模块时PIP install request 我收到错误 RuntimeError maximum recursion depth exceeded Command pyt
  • System.Drawing 可以在 Azure 网站中使用吗?

    我有一个网站 计划从一家老式网络托管公司迁移到 Microsoft Azure 它是一个 ASP NET 应用程序 使用 System Drawing 来呈现一些图形 我读过一些有关 Azure 网站不支持 GDI 的内容 这是否意味着 S
  • Angular ui-grid 双击行打开弹出窗口以编辑行

    VERSION 我正在使用 Angular ui grid 版本 3 0 0 RC 18 http ui grid info http ui grid info PROBLEM 我想在 ui grid 表中实现双击事件 特别是 我想在双击一
  • 是否可以始终使用“mov eax, 0x1”代替“mov rax, 0x1”?

    当组装这段代码时nasm BITS 64 mov eax 0x1 mov rax 0x1 我得到这个输出 b8 01 00 00 00 b8 01 00 00 00 这是操作码mov eax 0x1重复两次 这是否意味着mov rax 0x
  • 计算布尔值数组中真实成员的数量

    刚接触 javascript 我在计算布尔值数组中 true 的数量时遇到了麻烦 我正在尝试使用reduce 函数 有人可以告诉我我做错了什么吗 trying to count the number of true in an array
  • Android 画布绘制文本不工作

    我使用canvas的drawText方法制作了一个自定义视图 不知何故 任何 Jelly Bean 设备上都没有显示任何文本 它适用于 ICS 及以下版本 有谁知道此方法或任何相关方法从 API 15 到 16 是否发生了任何变化 编辑代码
  • JPA:不重写实体中的 equals() 和 hashCode() 吗?

    看完之后本文 http community jboss org wiki EqualsandHashCode 我倾向于不完全覆盖 equals 和 hashCode 在那篇文章的摘要中 关于根本没有 eq hC 列 唯一的结果是我无法执行如
  • __PRETTY_FUNCTION__、__FUNCTION__、__func__ 之间有什么区别?

    有什么区别 PRETTY FUNCTION FUNCTION func 它们记录在哪里 我如何决定使用哪一个 func 是一个隐式声明的标识符 当在函数内部使用时 它会扩展为包含函数名称的字符数组变量 它在 C99 中被添加到 C 中 从C
  • Android中如何设置按钮的背景图片?

    我在drawable mdpi中导入了一张图像 然后从按钮实现了该图像 但出现错误no resource found here 我该如何解决这个问题 我试过这个 main xml
  • Sencha Touch 动画选项

    在哪里可以找到 Ext Panel show 的可用动画类型列表 我搜索了文档并用谷歌搜索了 sencha touchanimation options 但找不到任何东西 你可以在这里看到所有的动画 http dev sencha com
  • 如何在 C++ 中增加“z”之外的字母组合?

    我正在处理 Excel 电子表格 并且必须仅使用一种类型的公式来处理大量数据 由于在公式中唯一必要的更改涉及字母 我想知道是否有一种方法可以制作一个程序 按照 Excel 列顺序 A B C Z AA AB AC AZ BA BB BC B
  • Asp.Net URL 的绝对路径

    为了使 Web 应用程序能够更轻松地与不同服务器上的另一个应用程序共享文件 我在母版页中使用了基本 href 标签 正如许多人发现的那样 这破坏了 Web 表单路径 我有一个工作表单适配器类 但不确定如何获取 url 的绝对路径 目前 我的
  • Apache 配置:Websockets 代理 WSS 请求到 WS 后端

    预先感谢您的任何帮助 我尝试使用 Apache 作为使用 WSS 的 Web 浏览器和后端 WS 服务器进程之间的代理 浏览器 Apache RabbitMQ Stomp 我在 Apache 中正确设置了 HTTPS 并通过 443 提供页
  • 如何使用 python 的 BaseHTTPServer / SimpleHTTPServer 调试 POST 请求?

    我找到了一个脚本这个网站 http wiki python org moin BaseHttpServer用于使用 python 通过命令行运行一个简单的服务器 我添加了一些print行 因为我想通过命令行打印请求的 GET 和 POST