
Mesop Query Params API 完全指南在 Python 中读写与导航 URL 查询参数【免费下载链接】mesopRapidly build AI apps in Python项目地址: https://gitcode.com/GitHub_Trending/me/mesopQuery Params查询参数也称 query string是 Mesop 中在 URL 里管理页面状态的核心机制为应用提供**可分享、可收藏、可直接深链deep-link**的入口。本文以 docs/api/query-params.md 为骨架结合 mesop/features/query_params.py、mesop/runtime/context.py 等源码实现系统讲解me.query_params的读取、遍历、修改、删除与删除键操作以及如何配合me.navigate在页面间传递查询参数。读完本文你将掌握在 Mesop 应用中实现基于 URL 的页面状态管理、跨页导航与深链分享的完整实战方案。概述为什么需要 Query ParamsQuery params 提供了一种把“状态”放进 URL 的途径例如?keywordmesoppage2。在 Mesop 中它的典型价值是深链deep-link用户可以把带参数的 URL 直接发给他人对方打开即可看到同一状态下的页面跨页传参页面 A 跳转到页面 B 时把筛选条件、搜索词等随导航传递过去可书签化浏览器书签保存的 URL 天然携带参数刷新后状态不丢失可分享符合 Web 平台惯例URL 即状态的“唯一标识”。从源码角度看Mesop 将查询参数建模为key - values的映射一个 key 可以对应多个值对应的 protobuf 定义为 mesop/protos/ui.proto 中的QueryParam消息message QueryParam { optional string key 1; // Note: a query param can be repeated, which is why it can have multiple values. repeated string values 2; }Mesop 在每次页面初始加载InitRequest和每次用户事件UserEvent时都会把浏览器端解析好的查询参数灌入服务端上下文相关调用位于 mesop/server/server.py 与 mesop/server/server.pyruntime().context().initialize_query_params( ui_request.init.query_params )Context.initialize_query_params见 mesop/runtime/context.py会把每个QueryParam的values转成list[str]存入self._query_params: dict[str, list[str]]这就是me.query_params背后的数据源。快速上手一个可运行的读写示例以下是一个简单可运行示例展示如何读取并写入 query params源自 docs/api/query-params.md 的 Example 小节me.page(path/examples/query_params/page_2) def page_2(): me.text(fquery_params{me.query_params}) me.button(Add query param, on_clickadd_query_param) me.button(Navigate, on_clicknavigate) def add_query_param(e: me.ClickEvent): me.query_params[key] value def navigate(e: me.ClickEvent): me.navigate(/examples/query_params, query_paramsme.query_params)这里完成了三件事在页面渲染时读取当前 URL 中的全部参数点击按钮时写入一个参数keyvalue点击“Navigate”时携带现有参数导航回另一个页面。完整的多页面演示可参考仓库中的 mesop/examples/query_params.py它覆盖了追加列表值、URL 编码、自增计数器、删除单个/全部参数、携带或不携带参数导航等多种场景。me.query_params 的字典式接口me.query_params由 mesop/features/query_params.py 导出query_params QueryParams(lambda: runtime().context())它本质上是QueryParams类的单例实例该类继承自 Python 标准库的MutableMapping[str, str]见 mesop/features/query_params.py因此拥有完整字典语义__iter__、__len__、__getitem__、__setitem__、__delitem__、in、str()等全部可用同时get_all是它额外扩展的方法。需要特别说明QueryParams内部并未自己存储数据而是通过构造时注入的get_context回调实时读写当前请求的Context._query_params。这意味着它总是反映当前页面最新的查询参数状态同一实例在页面加载、事件处理和导航过程中都能拿到正确数据。相应的单元测试覆盖了迭代、长度、字符串化、取值、get_all、删除、赋值等全部行为见 mesop/features/query_params_test.py。读取单个参数值value: str me.query_params[param_name]若参数不存在会抛出KeyError与字典行为一致该行为在 mesop/features/query_params_test.py 中有明确断言。因此读取前建议用in判断键是否存在if key in me.query_params: print(me.query_params[key])关于重复参数Repeated query params如果 URL 中同一个 key 出现多次如?tagatagb通过me.query_params[tag]只会取到第一个值。这是刻意设计的源码注释明确说明是为了对齐 Web 平台URLSearchParams.get的语义见 mesop/features/query_params.pydef __getitem__(self, key: str) - str: # Returns the first value associated with the key to match # the web API: # https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams/get return self._get_context().query_params()[key][0]获取某个 key 的全部值要拿到重复参数的所有值使用get_all它返回一个元组tuple若 key 不存在则返回空元组见 mesop/features/query_params.pyall_values me.query_params.get_all(param_name)# 例如 URL 为 ?tagatagbtagc 时 me.query_params.get_all(tag) # (a, b, c) me.query_params.get_all(nonexistent) # ()遍历所有参数QueryParams实现了__iter__可以直接用for遍历键名for key in query_params: value query_params[key]源码中的__iter__见 mesop/features/query_params.py直接代理到底层dict的迭代因此遍历顺序与 URL 中参数的解析顺序一致。由于每个 key 内部是列表若你想在遍历时保留多值信息推荐配合get_allfor key in me.query_params: print(key, me.query_params.get_all(key))另外QueryParams继承自MutableMapping所以len(me.query_params)、str(me.query_params)、{**me.query_params}字典解包等操作同样可用测试见 mesop/features/query_params_test.py。写入、重复值与删除设置单个参数query_params[new_param] value底层实现会同时做两件事见 mesop/runtime/context.py更新服务端内存中的_query_params字符串值会被包装成单元素列表向浏览器下发一条UpdateQueryParam命令对应 proto 定义 mesop/protos/ui.proto让浏览器地址栏的 URL 实时同步更新——这正是 Mesop 查询参数状态“写进 URL”的原理。设置重复参数一次赋多个值query_params[repeated_param] [value1, value2]传入列表或任意序列后底层会将其转换为list存储并同样生成UpdateQueryParam命令同步到 URL最终地址栏会呈现?repeated_paramvalue1repeated_paramvalue2。仓库示例 mesop/examples/query_params.py 展示了如何在事件中先读取现有列表、再追加新值后整体写回def append_query_param_list(e: me.ClickEvent): current_list ( [] if list not in me.query_params else me.query_params.get_all(list) ) state me.state(State) state.click_append_query_param_list 1 me.query_params[list] [ *current_list, fval{state.click_append_query_param_list}, ]删除参数del query_params[param_to_delete]__delitem__的实现见 mesop/features/query_params.py等价于调用set_query_param(keykey, valueNone)即把 value 置为None触发删除见 mesop/runtime/context.py同样会生成UpdateQueryParam命令使浏览器端 URL 移除该参数。清空全部参数的惯用写法是遍历后逐个删除注意先转成 list 以免迭代时修改字典见 mesop/examples/query_params.pydef delete_all_query_params(e: me.ClickEvent): for key in list(me.query_params.keys()): del me.query_params[key]结合 me.navigate 的模式me.navigate定义于 mesop/commands/navigate.py接受query_params关键字参数类型为dict[str, str | Sequence[str]] | QueryParams | None。它有一个值得注意的设计URL 字符串里自带的查询参数会被剥离并发出告警要求你改用query_params参数传递见 mesop/commands/navigate.py。这是因为导航命令需要将参数单独序列化进NavigateCommand的query_params字段mesop/protos/ui.proto而不是拼进 URL 字符串。携带现有 query params 导航def click_navigate_button(e: me.ClickEvent): me.query_params[q] value me.navigate(/search, query_paramsme.query_params)直接把me.query_params传给me.navigate即可保留当前页面全部参数。源码层面QueryParams实例会被展开为普通字典见 mesop/commands/navigate.pyif isinstance(query_params, QueryParams): query_params {key: query_params.get_all(key) for key in query_params}注意这里用get_all展开因此重复参数在导航时也会被完整保留。只携带新的 query params替换而非继承如果不想保留现有参数直接传入一个新字典即可def click_navigate_button(e: me.ClickEvent): me.navigate(/search, query_params{q: value})若不传query_params导航时当前页面的查询参数会被清空见 mesop/commands/navigate.py而当open_in_new_tabTrue时则保留当前页参数以便新标签页继承当前状态。编码与安全性Context.navigate在拼装完整 URL 时会用urllib.parse.quote对 key 和 value 做URL 百分号编码且对多值参数会为每个值各生成一个keyvalue段见 mesop/runtime/context.py。这意味着即使值里含有、、空格等特殊字符也不会破坏 URL 结构。仓库示例 mesop/examples/query_params.py 专门演示了这一行为def navigate_url_encoded_query_param(e: me.ClickEvent): me.navigate( /examples/query_params/page_2, query_params{ url_encoded: should-be-escapedtrue, url_encoded_values: [value1a1, value2a2], }, )导航目标支持绝对 URL如https://example.com/page与根相对 URL如/page但不支持文档相对 URL如page或./page详见 mesop/commands/navigate.py 的 docstring。常见模式总结需求写法说明读取单个值me.query_params[key]不存在抛KeyError重复 key 取第一个值安全读取if key in me.query_params: ...先判断再读取读取全部值me.query_params.get_all(key)返回 tuple不存在返回()遍历for k in me.query_params: ...遍历所有 key设置单个me.query_params[k] v同步更新浏览器 URL设置多个值me.query_params[k] [v1, v2]生成重复参数删除单个del me.query_params[k]同步从 URL 移除携带现有参数导航me.navigate(url, query_paramsme.query_params)完整保留含重复值全新参数导航me.navigate(url, query_params{q: v})不继承当前参数清空参数导航me.navigate(url)导航后参数被清空进阶在 on_load 中初始化查询参数由于me.query_params反映的是当前请求 URL 的状态你完全可以在页面on_load回调里基于 URL 参数初始化页面内容实现“打开链接即进入指定状态”的深链体验。仓库示例 mesop/examples/query_params.py 展示了这种用法def on_load(e: me.LoadEvent): me.query_params[on_load] loaded me.page(path/examples/query_params, on_loadon_load) def page(): me.text(fquery_params{me.query_params})该示例还包含第三页演示page_2点击后跳转到不携带任何参数的page_3而page_3的on_load又会写入on_load_page_3loaded验证了“参数随导航清空—再经 on_load 写入”的完整生命周期。结合 mesop/runtime/context.py 可知每次渲染前 Mesop 都会调用initialize_query_params重置参数表因此每个页面请求都从浏览器 URL 重新解析参数服务端不会残留上一次导航的状态。总结Mesop 的 Query Params API 以me.query_params这一个字典式对象统一了“读 URL、写 URL、跨页传递”三件事读取上对齐浏览器URLSearchParams语义重复 key 取首值、get_all取全量写入与删除会通过UpdateQueryParam命令实时同步到浏览器地址栏配合me.navigate的query_params参数则可实现携带/替换/清空三种导航策略。若需深入理解其实现推荐依次阅读 mesop/features/query_params.py、mesop/runtime/context.py、mesop/commands/navigate.py 以及完整示例 mesop/examples/query_params.py。【免费下载链接】mesopRapidly build AI apps in Python项目地址: https://gitcode.com/GitHub_Trending/me/mesop创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考