编程语言语言运行时编译器前端【免费下载链接】brythonBrython (Browser Python) is an implementation of Python 3 running in the browser项目地址https://gitcode.com/gh_mirrors/br/brython点击查看免费下载导读本文基于 Brython 官方 Cookbook 中的 read_file 示例www/doc/fr/cookbook/read_file.md系统讲解在浏览器中读取服务器端文件的两种典型方案使用 Python 内置函数open()同步读取以及使用browser.ajax模块异步请求并处理超时场景。读完本文你将掌握两种方案各自的适用场景、反缓存技巧query string 随机参数、Ajax 事件绑定与超时处理并能直接复用文中代码搭建自己的文件读取功能。问题场景浏览器中读取文件内容在纯浏览器环境下Python 程序没有操作系统级的文件系统可访问open()不再指向本地磁盘而是通过 HTTP 请求加载服务器上的静态资源。Brython 的 Cookbook 将读取一个文件的内容作为基础问题给出了两条解决路径同步方案直接调用内置函数open()读取文件内容异步方案使用browser.ajax发起 GET 请求并额外处理文件不存在或响应超时的情况。两种方案本质都是 HTTP 请求区别在于 API 形态与对异常场景的覆盖能力。方案一用内置 open() 同步读取文件基础代码from browser import document import time fake_qs ?foo%s % time.time() document[zone].value open(file.txt fake_qs).read()对应的 HTML 区域textarea idzone rows10 cols40Contenu Initial/textarea执行流程time.time()生成一个时间戳拼出带 query string 的文件名file.txt?fooxxxopen(...)通过 HTTP 请求获取文件内容并返回文件对象调用.read()读取全部文本写入document[zone].valuetextarea 的值。在 Brython 中open()由标准库 www/src/Lib/_io.py 中的__open(file, moder, buffering-1, encodingNone, errorsNone, newlineNone, closefdTrue, openerNone)实现其参数签名与 CPython 保持一致支持r默认只读、w写入并截断、x排他创建、a追加等模式。Cookbook 示例使用默认的r文本只读模式因此无需显式传入 mode。关键细节query string 反缓存示例中最容易被忽略的是fake_qs ?foo%s % time.time()这一行。它给请求 URL 附加了一个每次都不同的随机参数作用是绕过浏览器缓存当服务器上的file.txt内容被修改后再次调用open()时URL 因参数不同而被视为新资源从而强制重新拉取避免拿到陈旧内容。这与 www/doc/fr/browser.ajax.md 中cache参数的机制一致——Brython 的 Ajax 模块默认不使用浏览器缓存并自动向请求附加一个数字参数以达到同样的反缓存效果。方案一的适用边界open()同步方案代码最简洁适用于读取小型文本文件不关心加载耗时与错误处理文件确实存在于服务器上返回 HTTP 200。它的局限也很明显如果文件不存在或请求失败open()会抛出异常且同步阻塞期间页面脚本无法继续执行。Cookbook 因此紧接着给出了带超时与错误处理的 Ajax 版本。方案二用 browser.ajax 异步读取并处理超时完整代码from browser import ajax, document import time def on_complete(req): if req.status 200 or req.status 0: document[zone].value req.text else: document[zone].value error req.text def err_msg(): document[zone].text le serveur na pas répondu après %s secondes % timeout timeout 4 def go(url): req ajax.Ajax() req.bind(complete, on_complete) req.set_timeout(timeout, err_msg) req.open(GET, url, True) req.send() go(file.txt?foo%s % time.time())逐步拆解创建请求对象req ajax.Ajax()返回一个不带参数的新 Ajax 对象对应 Web API 的 XMLHttpRequest 封装见 www/src/libs/_ajax.js。绑定完成事件req.bind(complete, on_complete)把回调函数挂在complete事件上。browser.ajax支持的事件有uninitialized、loading、loaded、interactive、complete五个实践中一般只关心complete。设置超时req.set_timeout(timeout, err_msg)指定在 4 秒内未收到响应则取消请求并调用不带参数的err_msg()。发起请求req.open(GET, url, True)中第三个参数True表示异步脚本不等待响应继续执行req.send()真正发送请求。回调中的状态判断on_complete(req)接收请求对象作为唯一参数通过req.status判断结果200资源成功获取将req.text写入 textarea0本地文件协议等特殊场景下 status 为 0同样视为成功其他状态码如 404拼接error req.text写入页面。req.text是响应文本内容请求模式为text时是str实例。若请求模式为binarytext则是bytes实例若为json访问text会触发AttributeError应改用req.json属性见 www/doc/fr/browser.ajax.md。超时处理的执行路径set_timeout在 www/src/libs/_ajax.js 中实现超时到达后取消请求并调用注册的回调函数。示例中的err_msg()将提示文案写入document[zone].text告知用户服务器在 N 秒内没有响应。注意一个细节err_msg()中引用的timeout是模块级变量值为 4而go()中的req.set_timeout(timeout, err_msg)传入的也是同一个值——若想动态调整超时秒数只需修改这一处变量即可。两种方案对比与选型建议维度open() 同步方案browser.ajax 异步方案API 形态内置函数与 CPython 一致Ajax 对象 事件绑定阻塞行为同步脚本等待响应异步open(..., True)不阻塞错误处理异常抛出需 try/except通过req.status分支处理超时控制无内置机制set_timeout(秒数, 回调)适用场景小型文本、快速读取大文件、慢网络、需要用户反馈选型建议简单演示与内部工具页优先用open()面向用户的正式页面、需要展示加载失败或超时提示的场景务必使用browser.ajax方案。延伸browser.ajax 的其他读取模式browser.ajax模块还提供了更简洁的ajax.get(url, **callbacks)语法以及mode参数控制响应解析方式www/doc/fr/browser.ajax.mdmodetext默认req.text返回str可用encoding指定编码如encodinglatin1modebinaryreq.text/req.read()返回bytes适合图片等二进制资源modejsonreq.json返回反序列化后的 JSON 对象modedocumentreq.xml返回 XML 文档树。例如读取非 UTF-8 编码的文本文件from browser import ajax def read(req): print(req.text) ajax.get(test-latin1.txt, encodinglatin1, oncompleteread)读取二进制文件from browser import ajax def read(req): assert isinstance(req.read(), bytes) ajax.get(picture.png, modebinary, oncompleteread)读取 JSONfrom browser import ajax def read(req): print(req.json) ajax.get(test.json, modejson, oncompleteread)运行前提与限制两种方案都依赖 HTTP 服务需要将页面与file.txt通过本地服务器如仓库根目录的 server.py 或 server_aiohttp.py托管直接以file://打开时跨域与缓存行为可能与预期不同。示例中的file.txt为演示数据见 www/doc/fr/cookbook/file.txt实际使用时替换为服务器上真实存在的文件路径。反缓存参数?foo时间戳是必要的若两次请求 URL 完全相同浏览器可能直接返回缓存的旧内容导致修改服务器文件后页面看不到更新。browser.ajax的异步回调中无法捕获常规 Python 异常错误分支必须通过req.status显式判断超时则统一由set_timeout的回调处理。小结Brython 让 Python 开发者无需接触 JavaScript 即可完成浏览器端的文件读取。open()方案胜在简洁、贴近 CPython 习惯browser.ajax方案胜在异步、可控、健壮可覆盖超时与错误状态。两者结合随机 query string 的反缓存技巧即可应对服务器文件更新后页面必须同步刷新的常见需求。若需处理二进制、JSON、XML 等更多响应类型可直接在browser.ajax的mode参数上扩展相关细节可在 www/doc/fr/browser.ajax.md 中继续查阅。赞分享编程语言语言运行时编译器前端【免费下载链接】brythonBrython (Browser Python) is an implementation of Python 3 running in the browser项目地址https://gitcode.com/gh_mirrors/br/brython点击查看免费下载相关推荐Brython 中读取文件内容的两种实战方案内建 open() 与 browser.ajax 异步请求Brython 中读取文件内容的两种实战方案内建 open 与 browser.ajax 异步请求 导读 本文基于 Brython 官方 Cookbook编程语言语言运行时编译器前端在浏览器中读取文件内容Brython 的 open() 与异步 Ajax 双方案实战在浏览器中读取文件内容Brython 的 open 与异步 Ajax 双方案实战 导读 在 Brython浏览器中的 Python 3 实现中读取服务器上编程语言语言运行时编译器前端Brython 浏览器端 Ajax 请求实战指南browser.ajax 模块的双接口用法与源码剖析Brython 浏览器端 Ajax 请求实战指南browser.ajax 模块的双接口用法与源码剖析 browser.ajax 是 Brython运行在浏览编程语言语言运行时编译器前端上一篇如何找回被删除的QQ空间历史说说GetQzonehistory上手指南下一篇Akagi3步让雀魂AI助手跑起来新手也能看懂每一手创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?