Почему я получаю OSError -1, когда пытаюсь отправить заголовок ответа html [закрыто] ⇐ Python

Программы на Python
Anonymous
Почему я получаю OSError -1, когда пытаюсь отправить заголовок ответа html [закрыто]

Сообщение Anonymous »

Я попытался настроить небольшой сервер, на котором я мог бы в реальном времени определять значения всех контактов GPIO на Pico Pi W. Сначала я нашел этот пример, который работал отлично, затем я добавил функцию для добавления состояний контакты GPIO привязаны к HTML, но я получаю ошибку OSError -1 в следующей строке (все сообщение об ошибке представляет собой просто исключение в строке и OSError -1, в этой строке я отправляю заголовок HTML находится в конце ссылочного кода в цикле while):

Код: Выделить всё

conn.send(f'HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n')
Проблема возникает, когда я меняю HTML-код. Если я оставлю HTML-код из примера и использую этот заголовок, он сработает.
Я попробовал веб-приложение, которое читает HTML и отображает его, и оно сработало как задумано, так что, думаю, мне нужно возникла проблема с информацией, которую я пытаюсь отправить в заголовке.
Я также пробовал функции .encode() или .to_bytes() на заголовок и ответ, но это не помогло.
Я также пробовал разные заголовки, например здесь, где я определяю всю длину ответа:

Код: Выделить всё

conn.send(f'HTTP/1.0 200 OK\r\nContent-type: text/html\r\nContent-Length: {len(response)}\r\n\r\n')
Но ни один из них, похоже, не работал.
Отладка того, что я распечатываю в коде:

Код: Выделить всё

Got a connection from ('192.xxx.xxx.xxx', xxxxx) 
Request content, "b'GET / HTTP/1.1\\r\\nHost: 192.xxx.xxx.xxx\\r\\nConnection: keep-alive\\r\\nCache-Control: max-age=0\\r\\nUpgrade-Insecure-Requests: 1\\r\\nUser-Agent: Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Mobile Safari/537.36\\r\\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7\\r\\nAccept-Encoding: gzip, deflate\\r\\nAccept-Language: sk-SK,sk;q=0.9,cs;q=0.8,en-US;q=0.7,en;q=0.6,de;q=0.5,zh-TW;q=0.4,zh;q=0.3,af;q=0.2\\r\\n\\r\\n'"
Request: /
conn closed
Вся ошибка, если вам интересно:

Код: Выделить всё

Traceback (most recent call last):
File "", line 140, in 
OSError: -1
Вот весь код для справки:

Код: Выделить всё

# Import necessary modules
import network
import socket
import time
import random
from machine import Pin

# Create an LED object on pin 'LED'
led = Pin('LED')

# Wi-Fi credentials
ssid = 'SSID'
password = 'PASWORD'
def get_gpio_states():
gpio_html = ""
for pin_number in range(0, 28):  # Adjust based on your setup
pin = Pin(pin_number, Pin.IN)  # Set GPIO as input
state = pin.value()  # Read GPIO state
gpio_html += f"{pin_number}{state}"
return gpio_html
# HTML template for the webpage

def webpage(random_value, state,gpio_states):
gpio_states =gpio_states
html = f"""


Pico Web Server



Raspberry Pi Pico Web Server
Led Control







LED state: {state}
Fetch New Value



Fetched value: {random_value}
GPIO States


GPIO Pin
State

{gpio_states}



"""
return str(html)

# Connect to WLAN
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)

# Wait for Wi-Fi connection
connection_timeout = 20
while connection_timeout >  0:
if wlan.status() >= 3:
break
connection_timeout -= 1
print('Waiting for Wi-Fi connection...')
time.sleep(1)

# Check if connection is successful
if wlan.status() != 3:
raise RuntimeError('Failed to establish a network connection')
else:
print('Connection successful!')
network_info = wlan.ifconfig()
print('IP address:', network_info[0])

# Set up socket and start listening
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]
s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(addr)
s.listen()

#print('Listening on', addr)

# Initialize variables
state = "OFF"
random_value = 0

# Main loop to listen for connections
while True:
try:
conn, addr = s.accept()
print('Got a connection from', addr, conn)

# Receive and parse the request
request = conn.recv(1024)
request = str(request)
print('Request content,',repr(request))
if len(request) == 0:
print('Received empty request')
continue  # Skip to the next iteration of the loop

try:
request = request.split()[1]
print('Request:', request)
except IndexError as e:
print(e)
continue

# Process the request and update variables
if request == '/lighton?':
print("LED on")
led.on()
state = "ON"
#response = "ON"
elif request == '/lightoff?':
led.off()
state = 'OFF'
elif request == '/value?':
random_value = random.randint(0, 20)
elif request == '/':  # Handle the root request
#response = "Welcome to the pico web server"
random_value = 0  # Set default random value if needed
elif request == '/favicon.ico':
print("Favicon requested, ignoring.")
continue  # Skip further processing for favicon

# Generate HTML response
gpio_states = get_gpio_states()
response = webpage(random_value, state, gpio_states)
# Send the HTTP response and close the connection

# Here Is The Html Header

conn.send(f'HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n')
conn.send(response)

finally:
print('conn closed')
conn.close()
У меня нет больше информации, которую я мог бы предоставить по этому вопросу

Подробнее здесь: https://stackoverflow.com/questions/790 ... nse-header

Вернуться в «Python»