{"id":19484402,"url":"https://github.com/funnygeeker/micropython-easyweb","last_synced_at":"2025-04-25T16:33:38.131Z","repository":{"id":207934773,"uuid":"719932610","full_name":"funnygeeker/micropython-easyweb","owner":"funnygeeker","description":"A simple and versatile web server library for Micropython.  适用于 `Micropython` 的简易 Web Server 库","archived":false,"fork":false,"pushed_at":"2024-03-23T14:32:21.000Z","size":70,"stargazers_count":6,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-03-23T15:25:52.293Z","etag":null,"topics":["esp32","esp8266","flask","http-server","micropython","python","socket","stm32","web"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/funnygeeker.png","metadata":{"files":{"readme":"README.ZH-CN.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2023-11-17T08:02:33.000Z","updated_at":"2024-02-20T02:54:41.000Z","dependencies_parsed_at":"2023-11-23T13:29:47.537Z","dependency_job_id":"2ea35fb6-a2e5-4029-b86f-b503fb3f5434","html_url":"https://github.com/funnygeeker/micropython-easyweb","commit_stats":null,"previous_names":["funnygeeker/micropython-easyweb"],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/funnygeeker%2Fmicropython-easyweb","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/funnygeeker%2Fmicropython-easyweb/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/funnygeeker%2Fmicropython-easyweb/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/funnygeeker%2Fmicropython-easyweb/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/funnygeeker","download_url":"https://codeload.github.com/funnygeeker/micropython-easyweb/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224009358,"owners_count":17240542,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["esp32","esp8266","flask","http-server","micropython","python","socket","stm32","web"],"created_at":"2024-11-10T20:21:20.866Z","updated_at":"2024-11-10T20:21:22.441Z","avatar_url":"https://github.com/funnygeeker.png","language":"Python","readme":"[English (英语)](./README.md)\n\n# micropython-easyweb\n![EasyWeb](./web/EasyWeb_256px.png)\n- 适用于 `Micropython` 的：简易 Web Server 库，易用，多功能\n\n### 特点\n- 尽可能模仿了 `Flask` 框架的风格\n- 集成了常用的：GET 请求参数解析，表单解析，HTML渲染，文件发送，Cookies设置，Cookies获取，动态路由 等常用功能\n\n### 使用说明\n- 本项目一共有三个版本的文件，请根据实际需要进行选择：\n- `thread`: `/lib/easyweb_thread.py` 使用多线程实现\n- `asyncio`: `/lib/easyweb.py` 使用异步实现，具有较好的兼容性和可靠性\n- `single`: `/lib/easyweb_single.py` 使用单线程循环实现，具有较好的兼容性\n\n### 兼容性\n#### 已通过测试设备\n- `ESP-01S`: `single`\n- `ESP32`: `single`, `thread`, `asyncio`\n- `ESP32-C3`: `single`, `thread`, `asyncio`\n- `ESP32-S3`: `single`, `thread`, `asyncio`\n\n\n### 示例代码\n- 这里我们使用 [micropython-easynetwork](https://github.com/funnygeeker/micropython-easynetwork) 作为示例，连接局域网（也可以工作在AP模式，使用其他设备连接开发板）\n```python\nimport time\nfrom lib.easynetwork import Client\nfrom lib.easyweb import EasyWeb, render_template, send_file, make_response\n\nclient = Client()\nclient.connect(\"ssid\", \"password\")  # 或者 client.connect(\"ssid\", \"\")\n\nwhile not client.isconnected():\n    pass\nprint('IP Address: {}'.format(client.ifconfig()[0]))\n\new = EasyWeb()  # 初始化 EasyWeb\n\n# 添加路由\n@ew.route('/')\ndef home(request):\n    print(\"=======[request]=======\")\n    print('URL: ', request.url)\n    print('Args: ', request.args)\n    print('Form: ', request.form)\n    print('Host: ', request.host)\n    print('Json: ', request.json)\n    print('Path: ', request.path)\n    print('Header: ', request.headers)\n    print('Cookies: ', request.cookies)\n    print('Full_Path: ', request.full_path)\n    return render_template(\"/web/wifi.html\")\n\n# 发送文件\n@ew.route('/easyweb.png')\ndef img(request):\n    # 访问网页的 /easyweb.png 试试？\n    return send_file(\"/web/EasyWeb_256px.png\")\n\n# 下载文件\n@ew.route('/download')\ndef download(request):\n    # 访问网页的 /easyweb.png 试试？\n    # as_attachment: 是否作为附件发送文件，作为附件时会被下载\n    # attachment_filename: 下载文件时向用户显示的文件名。如果未提供，将使用原始文件名\n    return send_file(\"/web/EasyWeb_256px.png\", as_attachment=True, attachment_filename='easyweb.png')\n\n# 停止 EasyWeb\n@ew.route('/stop')\ndef stop(request):\n    ew.stop()\n\n# 获取字符串\n@ew.route('/user/\u003cstring\u003e')\ndef user(request):\n    # 访问网页的 /user/123456 试试？\n    return \"\u003ch1\u003eHello {}\u003c/h1\u003e\".format(request.match)\n\n# 获取路径\n@ew.route('/path/\u003cpath\u003e')\ndef path(request):\n    # 访问网页的 /path/123/456 试试？\n    return \"\u003ch1\u003ePath {}\u003c/h1\u003e\".format(request.match)\n\n# 渲染 HTML\n@ew.route('/time')\ndef the_time(request):\n    # 访问网页的 /time 然后刷新几遍页面，观察网页的变化\n    return render_template(\"/web/time.html\", time=time.time())\n\n# 获取与设置 Cookies\n@ew.route('/cookie')\ndef cookie(request):\n    # 访问网页的 /cookie 然后刷新几遍页面，观察网页的变化\n    response = make_response('\u003ch2\u003eCookies: {}\u003c/h2\u003e'.format(str(request.cookies)))\n    response.set_cookie('cookie_name', 'cookie_value')\n    return response\n\n# 自定义状态码\n@ew.route('/404')\ndef status_code(request):\n    # 访问网页的 /404，打开开发人员工具观察状态码\n    return '\u003ch2\u003e404 Not Found\u003c/h2\u003e', 404\n\n# 获取与设置 Cookies，同时自定义状态码\n@ew.route('/cookie2')\ndef cookie2(request):\n    # 访问网页的 /cookie 然后刷新几遍页面，观察网页的变化\n    response = make_response()  # 也可以在后面为 response.data 赋值，来代替初始化时赋值\n    response.data = '\u003ch2\u003eCookies: {}\u003c/h2\u003e\u003c/br\u003e\u003ch2\u003e404 Not Found\u003c/h2\u003e'.format(str(request.cookies))\n    response.set_cookie('cookie_name', 'cookie_value')\n    return response, 404\n\n# 获取 JSON 格式的内容\n@ew.route('/json')\ndef cookie2(request):\n    # 访问网页的 /json\n    return {'type': 'json', 'num': 123}\n\new.run()\nprint('======END======')  # 访问 /stop\n```","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffunnygeeker%2Fmicropython-easyweb","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffunnygeeker%2Fmicropython-easyweb","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffunnygeeker%2Fmicropython-easyweb/lists"}