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

View File

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