This commit is contained in:
2026-01-24 17:20:04 +08:00
parent 3f9c6cc0a0
commit 16501b77d9
2 changed files with 29 additions and 27 deletions

View File

@@ -172,7 +172,7 @@ def start():
)
# /weather: 返回天气数据
@naw.route("/weather/*")
@naw.route("/weather*")
async def weather_status(request):
await request.write("HTTP/1.1 200 OK\r\n")
await request.write("Content-Type: application/json\r\n\r\n")
@@ -197,12 +197,15 @@ def start():
await request.write(json.dumps(config.config_data))
# /config/set: 更新配置
# curl -H "Content-Type: application/json" -X POST -d '{"city":"xxx","who":"ami"}' 'http://<url>/config/set'
@naw.route("/config/set")
async def config_update(request):
ack = {"status": "success"}
try:
post_data = json.loads(await request.read())
for k, v in post_data.items():
content_length = int(request.headers['Content-Length'])
post_data = (await request.read(content_length)).decode()
for k, v in json.loads(post_data).items():
config.set(k, v)
config.write()
except Exception as e:

View File

@@ -1,8 +1,7 @@
import uasyncio as asyncio
import uerrno
__version__ = '1.0.0'
__version__ = "1.0.0"
class HttpError(Exception):
@@ -29,9 +28,7 @@ class Request:
async def write(request, data):
await request.write(
data.encode('ISO-8859-1') if type(data) == str else data
)
await request.write(data.encode("ISO-8859-1") if type(data) == str else data)
async def error(request, code, reason):
@@ -41,7 +38,7 @@ async def error(request, code, reason):
async def send_file(request, filename, segment=64, binary=True):
try:
with open(filename, 'rb' if binary else 'r') as f:
with open(filename, "rb" if binary else "r") as f:
while True:
data = f.read(segment)
if not data:
@@ -54,28 +51,29 @@ async def send_file(request, filename, segment=64, binary=True):
class Nanoweb:
extract_headers = ('Authorization', 'Content-Length', 'Content-Type')
extract_headers = ("Authorization", "Content-Length", "Content-Type")
headers = {}
routes = {}
assets_extensions = ('.html', '.css', '.js', '.jpg', '.png', '.gif')
assets_extensions = (".html", ".css", ".js", ".jpg", ".png", ".gif")
callback_request = None
callback_error = staticmethod(error)
STATIC_DIR = ''
INDEX_FILE = STATIC_DIR + '/index.html'
STATIC_DIR = ""
INDEX_FILE = STATIC_DIR + "/index.html"
def __init__(self, port=80, address='0.0.0.0'):
def __init__(self, port=80, address="0.0.0.0"):
self.port = port
self.address = address
def route(self, route):
"""Route decorator"""
def decorator(func):
self.routes[route] = func
return func
return decorator
async def generate_output(self, request, handler):
@@ -117,7 +115,7 @@ class Nanoweb:
async def handle(self, reader, writer):
items = await reader.readline()
items = items.decode('ascii').split()
items = items.decode("ascii").split()
if len(items) != 3:
return
@@ -135,7 +133,7 @@ class Nanoweb:
while True:
items = await reader.readline()
items = items.decode('ascii').split(":", 1)
items = items.decode("ascii").split(":", 1)
if len(items) == 2:
header, value = items
@@ -149,30 +147,31 @@ class Nanoweb:
if self.callback_request:
self.callback_request(request)
if request.url in self.routes:
request_url = request.url.rstrip("/")
if request_url in self.routes:
# 1. If current url exists in routes
request.route = request.url
await self.generate_output(request,
self.routes[request.url])
request.route = request_url
await self.generate_output(request, self.routes[request_url])
else:
# 2. Search url in routes with wildcard
for route, handler in self.routes.items():
if route == request.url \
or (route[-1] == '*' and
request.url.startswith(route[:-1])):
if route == request_url or (
route[-1] == "*" and request_url.startswith(route[:-1])
):
request.route = route
await self.generate_output(request, handler)
break
else:
# 3. Try to load index file
if request.url in ('', '/'):
if request_url in ("", "/"):
await self.generate_output(request, self.INDEX_FILE)
else:
# 4. Current url have an assets extension ?
for extension in self.assets_extensions:
if request.url.endswith(extension):
if request_url.endswith(extension):
await self.generate_output(
request, '%s%s' % (self.STATIC_DIR,request.url),
request,
"%s%s" % (self.STATIC_DIR, request_url),
)
break
else: