简体   繁体   English

Python BaseHTTPRequestHandler服务器仅适用于第一个GET请求

[英]Python BaseHTTPRequestHandler server works for first GET request only

I'm working on trying create a super basic python webserver based on BaseHTTPRequestHandler. 我正在尝试基于BaseHTTPRequestHandler创建一个超级基本的python网络服务器。 When I perform the GET request to the address 127.0.0.1/a for the first time, everything works well and I recover an image on my browser. 第一次执行对地址127.0.0.1/a的GET请求时,一切正常,并且在浏览器中恢复了图像。

However, when I repeat this GET request a second time, I do not get anything. 但是,当我第二次重复此GET请求时,我什么也没得到。 Tracing the code, I can see that the code itself is running through the entire do_GET(self) segment. 跟踪代码,我可以看到代码本身正在整个do_GET(self)段中运行。

I'm really confused as to why the webserver would work the first time and not the next. 我真的很困惑为什么Web服务器会在第一次而不是下次运行。

Any and all help is much appreciated. 任何帮助都将不胜感激。

from http.server import BaseHTTPRequestHandler, HTTPServer  
from os import curdir, sep


imagefile = "a.jpg"
imagepage =open(curdir+sep+imagefile, 'rb')

notfound = "File not found"

class webserverHandler(BaseHTTPRequestHandler):
    def do_OPTIONS(self):
        self.send_response(200)
        self.send_header('Access-Control-Allow-Origin', '*')                
        self.send_header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS')
        self.send_header("Access-Control-Allow-Headers", "X-Requested-With") 

    def do_GET(self):
        if self.path == "/a":
            print("getting thg jpg file")
            self.send_response(200)
            self.send_header("Content-type","image/png")
            self.end_headers()
            self.wfile.write(imagepage.read())
    else:
        self.send_error(404, notfound) 

def main():
    try:
        port = 1234
        server = HTTPServer(('127.0.0.1', port), webserverHandler)
        print("Web server is running on port {}".format(port))
        server.serve_forever()

    except KeyboardInterrupt:
        print("^C entered, stopping web server...")

    finally:
        if server:
            print("closing server")
            server.socket.close()


if __name__ == '__main__':
    main()

Thank you! 谢谢!

def do_GET(self):
    notfound = "File not found"
    if self.path == "/a":
        print("getting thg jpg file")
        self.send_response(200)
        self.send_header("Content-type","image/png")
        self.end_headers()
        imagefile = "fig1.png"
        imagepage =open(curdir+sep+imagefile, 'rb')
        self.wfile.write(imagepage.read())
    else:
        self.send_error(404, notfound) 

Please read file in each request. 请阅读每个请求中的文件。

Why: 为什么:
imagepage.read() make file seek to end of the image file, So, we cannot read any data with next imagepage.read() from second request. imagepage.read()使文件查找到图像文件的末尾,因此,我们无法从第二个请求中读取下一个imagepage.read()任何数据。


Or 要么
We can use imageContent = imagepage.read() at first, 首先,我们可以使用imageContent = imagepage.read()
and we can send imageContent every request from http.server import BaseHTTPRequestHandler, HTTPServer 我们可以从http.server导入BaseHTTPRequestHandler,HTTPServer的每个请求发送imageContent
from os import curdir, sep 从os import curdir,sep

imagefile = "fig1.png"
imagepage =open(curdir+sep+imagefile, 'rb')
imageContent = imagepage.read() # Read Image here

notfound = "File not found"

class webserverHandler(BaseHTTPRequestHandler):
    def do_OPTIONS(self):
        self.send_response(200)
        self.send_header('Access-Control-Allow-Origin', '*')                
        self.send_header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS')
        self.send_header("Access-Control-Allow-Headers", "X-Requested-With") 

    def do_GET(self):
        if self.path == "/a":
            print("getting thg jpg file")
            self.send_response(200)
            self.send_header("Content-type","image/png")
            self.end_headers()
            self.wfile.write(imageContent)
        else:
            self.send_error(404, notfound) 

def main():
    try:
        port = 1234
        server = HTTPServer(('127.0.0.1', port), webserverHandler)
        print("Web server is running on port {}".format(port))
        server.serve_forever()

    except KeyboardInterrupt:
        print("^C entered, stopping web server...")

    finally:
        if server:
            print("closing server")
            server.socket.close()


if __name__ == '__main__':
    main()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Python:GET请求后重置BaseHTTPRequestHandler的实例 - Python: Instance of BaseHTTPRequestHandler resets after GET Request 如何使用 BaseHTTPRequestHandler 将客户端的 Get 请求转发(路由)到 Apache 等本地服务器文件? - How can I use BaseHTTPRequestHandler to forward(routing) the client's Get request to a local server file like Apache? Python33-使用BaseHTTPRequestHandler改善服务器安全性 - Python33 - Improving server security with BaseHTTPRequestHandler python BaseHTTPRequestHandler和本地http服务器目录以打开文件 - python BaseHTTPRequestHandler and local http server directory for opening file 请求仅适用于循环中的第一项? - Request only works for first item in a loop? 在托管的 http.server.BaseHTTPRequestHandler 中获取访问者的 ipv4 地址 - Get ipv4 address of visitors in http.server.BaseHTTPRequestHandler hosted 如何将参数传递给 Python 中 BaseHTTPRequestHandler class 的 GET 处理程序方法 - How to pass parameter to GET-handler method of BaseHTTPRequestHandler class in Python 如何从BaseHTTPRequestHandler python获取x509.Certificate - How to get x509.Certificate from BaseHTTPRequestHandler python python 3.6 BaseHTTPRequestHandler - python 3.6 BaseHTTPRequestHandler python BaseHTTPRequestHandler实例错误 - python BaseHTTPRequestHandler instance error
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM