标签: basehttprequesthandler

如何在BaseHTTPRequestHandler.do_POST()中提取HTTP消息体?

在我的do_POST()方法中,BaseHTTPRequestHandler我只需通过属性访问POST请求的标题self.headers.但是我找不到用于访问消息正文的类似属性.那我怎么去做呢?

python post http basehttpserver basehttprequesthandler

44
推荐指数
1
解决办法
3万
查看次数

使用BaseHTTPRequestHandler编写响应主体

我正在使用Python 3.2.2玩一点,想要编写一个简单的Web服务器来远程访问一些数据.这些数据将由Python生成,因此我不想使用SimpleHTTPRequestHandler,因为它是文件服务器,而是我自己的处理程序.

我从互联网上复制了一些例子,但我被卡住了,因为响应输出流拒绝写入正文内容.

这是我的代码:

import http.server
import socketserver

PORT = 8000

class MyHandler(http.server.BaseHTTPRequestHandler):
    def do_HEAD(self):
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.end_headers()
    def do_GET(self):
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.end_headers()
        print(self.wfile)
        self.wfile.write("<html><head><title>Title goes here.</title></head>")
        self.wfile.write("<body><p>This is a test.</p>")
        # If someone went to "http://something.somewhere.net/foo/bar/",
        # then s.path equals "/foo/bar/".
        self.wfile.write("<p>You accessed path: %s</p>" % self.path)
        self.wfile.write("</body></html>")
        self.wfile.close()

try:
    server = http.server.HTTPServer(('localhost', PORT), MyHandler)
    print('Started http server')
    server.serve_forever()
except KeyboardInterrupt:
    print('^C received, shutting down server')
    server.socket.close()
Run Code Online (Sandbox Code Playgroud)

编写响应正文的正确代码应该是什么?

非常感谢.

编辑:

错误是:

...
  File "server.py", line …
Run Code Online (Sandbox Code Playgroud)

python basehttprequesthandler

25
推荐指数
2
解决办法
5万
查看次数

具有自定义实例的BaseHTTPRequestHandler

这是我的http服务器:

from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer

class test:
    def show(self):
        return "aaaa"

class http_server:
    def __init__(self, t1):
        self.t1 = t1
        server = HTTPServer(('', 8080), myHandler)
        server.serve_forever()

class myHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header('Content-type','text/html')
        self.end_headers()
        self.wfile.write(self.t1.show()) #Doesnt work
        return

class main:
    def __init__(self):
        self.t1 = test()
        self.server = http_server(self.t1)

if __name__ == '__main__':
    m = main()
Run Code Online (Sandbox Code Playgroud)

我需要访问myHander中的实例t1.

有什么方法可以做到吗?

谢谢!

python basehttpserver httpserver requesthandler basehttprequesthandler

14
推荐指数
3
解决办法
2万
查看次数

Python:BaseHTTPRequestHandler - 阅读原始帖子

如何阅读原始http帖子STRING.我找到了几个用于读取帖子的解析版本的解决方案,但是我正在处理的项目提交了一个没有标题的原始xml有效负载.所以我试图找到一种方法来读取post数据,而不将其解析为key => value数组.

python basehttpserver httpserver basehttprequesthandler

12
推荐指数
3
解决办法
1万
查看次数

如何覆盖BaseHTTPRequestHandler log_message()方法以记录到文件而不是控制台(sys.stderr)?

我正在使用BaseHTTPServer.HTTPServer创建Web服务

我想记录以下内容以记录到文件而不是控制台.但我还没有设法找到办法.

10.23.23.19 - - [29/Nov/2013 08:39:06] "GET / HTTP/1.1" 200 -
10.23.23.19 - - [29/Nov/2013 08:39:06] "POST / HTTP/1.1" 200 -
10.24.20.14 - - [29/Nov/2013 08:39:27] "POST / HTTP/1.1" 200 -
10.24.20.14 - - [29/Nov/2013 08:39:31] "POST / HTTP/1.1" 200 -
Run Code Online (Sandbox Code Playgroud)

我的代码看起来像这样:

from BaseHTTPServer import HTTPServer
from pysimplesoap.server import SoapDispatcher, SOAPHandler
.
# The rest of the code
.
.
httpd = HTTPServer(("", 8059),SOAPHandler)
    httpd.dispatcher = dispatcher
    httpd.serve_forever()
Run Code Online (Sandbox Code Playgroud)

我正在使用Python 2.6

python logging basehttpserver basehttprequesthandler

7
推荐指数
2
解决办法
6467
查看次数

如何使用BaseHTTPRequestHandler访问发送到我的服务器的数据?

我是Python的新手(使用v3.3)和网络编程,我整晚都在努力解决问题.我正在向我的服务器发出POST调用并向其发送一些数据,如下所示:

DATA = {"listName":"Test list","listDesc":"A test list with test stuff in it.","refreshMode":"Replace","DBKey":"1","UserDisplaySeq":"1"}
DATA = json.dumps(DATA)
METHOD = "POST"
DATA = DATA.encode("utf-8")
params = "account_id=acct 2"
try:
    URL = "http://localhost:8080/lists?" + quote_plus(params)
    request = urllib.request.Request(url=URL,data=DATA,method=METHOD)
    response = urllib.request.urlopen(request)
...
Run Code Online (Sandbox Code Playgroud)

我还有一个请求处理程序编码如下(这里有很多打印语句用于调试目的):

class MyHandler(BaseHTTPRequestHandler):
...
def do_POST(self):
    length = int(self.headers['Content-Length'])
    print("HEADERS: ", self.headers)
    print (str(length))
    print(self.rfile)
    post_data = urllib.parse.parse_qs(self.rfile.read(length).decode('utf-8'))
    print(post_data)
Run Code Online (Sandbox Code Playgroud)

这会将以下结果打印到控制台:

Starting thread
started httpserver...
HEADERS:  Accept-Encoding: identity
User-Agent: Python-urllib/3.3
Content-Length: 138
Content-Type: application/x-www-form-urlencoded
Host: localhost:8080
Connection: close


138
<_io.BufferedReader name=404>
{}
Run Code Online (Sandbox Code Playgroud)

我的问题: …

python post python-3.x basehttprequesthandler

6
推荐指数
1
解决办法
1万
查看次数

如何从 Python HTTP 服务器调用函数?

我想为我的一个应用程序提供一个 Web 界面。为了实现这一点,我BaseHTTPRequestHandlerBaseHTTPServer包中进行子类化(到我调用的类中_RequestHandler)并实现我自己的 HTTPHEAD / GET / POST / PUT请求处理程序。

当我收到对“普通文件”的请求时,我只需打开它,从文件系统中读取它并将其提供给浏览器。效果很好。但是,作为一个 Web 界面,我还想将某些请求传达给应用程序后端。为此,我希望我的服务器提供一个接口,通过该接口可以注册某些 URL 的回调函数(由后端),当有注册 URL 的请求传入并传递请求头和正文时,将调用该回调函数到为该 URL 注册的请求处理程序(= 回调函数)。

IE。我希望能够做这样的事情。

def callback_function(request):
   # Do some processing.
   return response

srv = WebServer(port = 8080, webroot = "htdocs/")
srv.register("/cgi-bin/test", callback_function)
srv.run()
Run Code Online (Sandbox Code Playgroud)

现在,当有人使用浏览器请求某个尚未注册的任意 URL 时,Web 服务器将加载指定的文件(相对于“Web 根目录”)并传送它。

我原则上知道如何实现这一点。将应以不同方式处理的 URL 放入字典中。对于每个请求,检查请求的 URL 是否在字典中。如果是,则将请求数据(HTTP header 和 body)放入“请求对象”中,调用为该 URL 注册的回调函数并将该请求对象传递给它。从回调函数获取响应对象,提取其内容(HTTP 标头和正文)并将其提供给客户端。如果 URL 不在“特殊处理”字典中,则只需从文件系统(相对于“Web 根”)加载文件并提供服务。

问题是,为了运行网络服务器,我必须做这样的事情。

server = HTTPServer(("localhost", port), _RequestHandler)
server.serve_forever()
Run Code Online (Sandbox Code Playgroud)

现在的问题是我无法将对象(实例)传递_RequestHandler构造函数 …

python simplehttpserver basehttprequesthandler

6
推荐指数
0
解决办法
3310
查看次数

向 http.server.BaseHTTPRequestHandler 的子类添加一个新的实例变量

我希望能够将实例变量添加到我的http.server.BaseHTTPRequestHandler子类中。

这是我的代码:

from http.server import BaseHTTPRequestHandler, HTTPServer
import urllib


class Server(BaseHTTPRequestHandler):

    def __init__(self, request, client_addr, server):
        super().__init__(request, client_addr, server)
        self.pathobj = urllib.parse.urlparse(self.path)

    def do_HEAD(self):
        self.send_response(200)

    def do_GET(self):
        print(self.pathobj)
        self.send_response(200)
        self.end_headers()

    def do_POST(self):
        print(self.pathobj)
        self.send_response(405)
        self.end_headers()   

def run(server_class=HTTPServer, handler_class=Server, port=8080):
    server_address = ("", port)
    httpd = server_class(server_address, handler_class)

    print("Starting httpd on port {}...".format(port))

    httpd.serve_forever()

if __name__ == "__main__":
    run()
Run Code Online (Sandbox Code Playgroud)

我希望能够访问每个类方法中ParseResult返回的对象,urllib.parse.urlparse而无需在每个类方法self.pathobj = urllib.parse.urlparse(self.path)的开头重写。

上面的代码不起作用 - 当do_GET或被do_POST调用时,它会抱怨'Server' object has no …

http python-3.x basehttprequesthandler

6
推荐指数
1
解决办法
927
查看次数

Python BaseHTTPRequestHandler:用JSON响应

我有一个继承BaseHTTPRequestHandler并实现该方法的Python类do_POST

我目前仅使用方法末尾的以下命令以整数状态(例如200)成功响应:

self.send_response(200)
Run Code Online (Sandbox Code Playgroud)

我也尝试发送一些字符串作为响应的一部分。我该怎么办?

python basehttpserver basehttprequesthandler

5
推荐指数
2
解决办法
6883
查看次数

BaseHTTPRequestHandler 挂在 self.rfile.read() 上

我使用 BaseHTTPRequestHandler 实现了一个 python 服务器,它通常会在从套接字文件对象读取时挂起。我读了多少字节似乎并不重要。我可以读取 30k 字节并且它不会挂起,或者我可以读取 7k 字节并且它会挂起。它正在读取一个 Base64 字符串编码的图像,所以我知道它是否需要一两秒钟才能读取,但它实际上只是挂起。

有时,当我按下 CTRL-C 时,它会解开并神奇地读取所有内容。这真的很奇怪。任何帮助将不胜感激。谢谢。另外,这是python2.7。

代码:

def do_POST(self):
    print self.rfile
    # Processing HTTP POST request data
    content_len = int(self.headers.getheader('content-length'))
    print 'Reading from HTTP header. Size: %s' % (content_len)

    # THIS IS WHERE IT HANGS 
    post_body_json = self.rfile.read(content_len)

    print 'Got it. Moving on, now.'
    post_body = json.loads(post_body_json)
    image_data = post_body.get('img_string_b64', 'No Image String')

    print 'Decoding image string.'
    # Processing image data
    image_name = 'image.jpg'
    decoded_str = base64.decodestring(image_data)
    self.write_image_to_system(decoded_str, image_name)

    print 'Getting text …
Run Code Online (Sandbox Code Playgroud)

html http http-headers python-2.7 basehttprequesthandler

5
推荐指数
1
解决办法
1583
查看次数