diff --git a/src/rom/app.py b/src/rom/app.py index ebe544c..ce6adbf 100644 --- a/src/rom/app.py +++ b/src/rom/app.py @@ -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:///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: diff --git a/src/rom/nanoweb.py b/src/rom/nanoweb.py index 27eadb1..b75c701 100644 --- a/src/rom/nanoweb.py +++ b/src/rom/nanoweb.py @@ -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: