python - 使用 Python 的 HTTP 服务器和 HTML 中的图像
问题描述
我正在尝试使用 python 创建一个 HTTP 服务器。
一切正常,但图像未使用 localhost:{port} 在 Google chrome 或 Microsoft Edge 中加载。
有代码:
import socket
import time
http_head = "HTTP/1.1 200 OK\r\n"
http_head += "Date:"+ time.asctime() +"GMT\r\n"
http_head += "Expires: -1\r\n"
http_head += "Cache-Control: private, max-age=0\r\n"
http_head += "Content-Type: text/html;"
http_head += "charset=utf-8\r\n"
http_head += "\r\n"
data = "<html><head><meta charset='utf-8'/></head>"
data += "<body><h1>In321 is the best course ! (doubt) </h1>"
data += "\r\n"
data += "<img src=\"C:\\Users\\aliel\\OneDrive\\Documents\\GitHub\\TP2_In321\\crying_cat_with_thumb_up.jpg\" alt=\"A crying cat with thumb up\">"
data += "</body></html>\r\n"
data += "\r\n"
http_response = http_head.encode("ascii") + data.encode("utf-8")
TCP_IP = '127.0.0.1'
TCP_PORT = 55000
BUFFER_SIZE = 1024
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT)) # Demande à l’OS d’associer la socket à une ip/port
s.listen(1) # transforme la socket en socket de connexion
print(" Waiting client… ")
scom, caddr = s.accept()
print("client connected with address : ", caddr)
data = scom.recv(BUFFER_SIZE)
print("received data:", data.decode('utf-8'))
scom.send(http_response)
s.close()
scom.close()
解决方案
问题是由于您使用的是字符串,因此加载 HTML 内容后的浏览器会尝试加载图像,但随后会注意到您正在尝试读取本地文件并因此阻止请求。(如果您右键单击图像并单击复制图像地址,您可以看到它说"about:blank#blocked"
)。您可以通过创建 HTML 文件或将图像作为字节嵌入字符串本身来避免这种情况。你可以这样做
import base64
with open(path,"rb") as i:
encoded_string = base64.b64encode(i.read()).decode( 'utf-8' )
并将以下内容添加到您的图像源(图像path
的路径在哪里)
data += f'<img src="data:image/png;base64, {encoded_string}">'
推荐阅读
- javascript - 有没有办法将类变量值动态转换为字符串文字类型(在 Typescript 中)?
- python-3.x - 未加载库:找不到 libdb2.dylib 图像
- powershell - Powershell - 计算文件中的行数,不包括/包括某些行
- php - 如何正确重构此功能?
- graphics - 计算机图形学
- google-apps-script - 从谷歌表格中特定范围的单元格创建 PDF 并将其保存到谷歌驱动器
- python - Base58 随机字符串生成器
- syntax - 如何使用 TF_VAR_name 在 terraform 中使用环境变量?
- python - pythonic将numpy数组中的值转换为0或1的方法
- r - ggplot:当数据点是每周时,如何将 x 轴分成几个月?