Flet WebView 请求方法 RequestMethod 详解:用 load_request 控制 GET 与 POST 加载
2026/9/23 9:15:37 网站建设 项目流程
  • 前端
  • 跨平台
  • 桌面应用
  • 移动开发

【免费下载链接】flet

Build realtime web, mobile and desktop apps in Python only. No frontend experience required.

项目地址:https://gitcode.com/gh_mirrors/fl/flet
点击查看免费下载

RequestMethod是 Flet 官方扩展包flet-webview中定义的 HTTP 请求方法枚举,用于在使用WebView.load_request()以编程方式发起页面加载时,明确指定底层 HTTP 请求使用 GET 还是 POST 方法。本文以 requestmethod.md 对应的类文档为骨架,结合 flet-webview 的 Python 与 Flutter 双层源码,讲清该枚举的定义、用法、平台限制与底层映射,使读者能够在 iOS、Android、macOS 应用中通过 Flet 代码精确控制 WebView 的页面加载请求。

RequestMethod:flet-webview 中的 HTTP 方法枚举

RequestMethod是一个标准的 Pythonenum.Enum,定义于 types.py,其类文档原文为:"Defines the supported HTTP methods for loading a page in aWebView"(定义在WebView中加载页面所支持的 HTTP 方法)。

class RequestMethod(Enum): """Defines the supported HTTP methods for loading a page in a `WebView`.""" GET = "get" """HTTP GET method.""" POST = "post" """HTTP POST method."""

当前版本仅包含两个成员,枚举值(value)为小写字符串,与 WebView 底层所需的请求方法标识保持一致:

成员枚举值说明
RequestMethod.GET"get"HTTP GET 方法,加载页面时的默认值
RequestMethod.POST"post"HTTP POST 方法,适用于需要提交表单体(request body)的页面加载

该枚举被flet-webview包作为公共 API 导出,可从包顶层直接导入使用:

from flet_webview import RequestMethod

其导出声明可见于 __init__.py,与WebView控件、JavaScriptModeLogLevelSeverity以及三个事件数据类一同列于__all__中。

load_request:RequestMethod 的唯一消费方

RequestMethod在实际代码中只被WebView.load_request()一个方法消费,该方法定义于 webview.py:

async def load_request(self, url: str, method: RequestMethod = RequestMethod.GET): """ Makes an HTTP request and loads the response in the webview. Args: url: The URL to load. A `file://` URL is loaded as a local file, the same way :meth:`load_file` does. method: The HTTP method to use. Ignored for `file://` URLs. Note: Works only on the following platforms: iOS, Android, and macOS. """ self._check_mobile_or_mac_platform() await self._invoke_method( "load_request", arguments={"url": url, "method": method} )

要点如下:

  • 参数url:要加载的 URL。若传入file://协议地址,则按本地文件方式加载(等价于调用load_file()),此时method参数会被忽略;
  • 参数method:要使用的 HTTP 方法,默认值为RequestMethod.GET,类型即本文主角RequestMethod
  • 返回值None,方法为异步(async),调用时需await
  • 平台限制:仅支持 iOS、Android、macOS 三个平台,方法入口处首先调用_check_mobile_or_mac_platform()(webview.py)做运行时校验,在 Web 平台或 Linux、Windows 上调用会抛出ft.FletUnsupportedPlatformException

参数如何从 Python 传到 WebView

load_request()内部通过self._invoke_method("load_request", ...)urlmethod两个参数序列化后发送给 Flutter 端。method传入的是RequestMethod枚举实例,序列化后即为小写字符串"get""post",这与 Flutter 端webview_flutter包中LoadRequestMethod.get/LoadRequestMethod.post的命名天然对应。

底层映射:Python 枚举如何驱动 webview_flutter

在 Flutter 侧,flet-webview的 Android/iOS/macOS 实现位于 webview_mobile_and_mac.dart,其中load_request的 invoke 分支(L197-L203)如下:

case "load_request": var url = args["url"]; if (url != null) { await _load(url, parseLoadRequestMethod(args["method"], LoadRequestMethod.get)!); } break;

字符串到 Dart 枚举的解析由工具函数parseLoadRequestMethod完成(utils/webview.dart),它基于 flet 框架通用的parseEnum"get"/"post"解析为LoadRequestMethod枚举值,解析失败时回退到LoadRequestMethod.get

LoadRequestMethod? parseLoadRequestMethod(String? value, [LoadRequestMethod? defaultValue]) { return parseEnum(LoadRequestMethod.values, value, defaultValue); }

真正发起请求的是内部_load()方法(L39-L50):

Future<void> _load(String url, LoadRequestMethod method) async { var uri = Uri.parse(url); if (uri.scheme == "file") { try { await controller.loadFile(uri.toFilePath()); return; } on UnsupportedError catch (e) { debugPrint("WebView: $url is not a valid local file path: $e"); } } await controller.loadRequest(uri, method: method); }

这段源码揭示了两条关键行为:

  1. file://优先走loadFile:源码注释明确指出,file://地址必须经由WebViewController.loadFile才能获得平台本地文件访问权限——Android 端需要切换默认关闭的WebSettings.allowFileAccess,iOS/macOS 端需要loadFileURL:allowingReadAccessToURL:才能让同目录下的脚本、样式、图片等资源一并可读;直接对file://地址执行loadRequest在 Android 上会报net::ERR_ACCESS_DENIED。这正是 Python 端 docstring 中"method 参数对file://URL 被忽略"的底层原因;
  2. http(s)://直接透传方法:非file://的地址会原样调用controller.loadRequest(uri, method: method),即webview_flutter底层的WebViewController.loadRequest,将 GET/POST 方法语义完整传递到系统 WebView。

初始加载时 method 的默认处理

RequestMethod不仅用于load_request()动态调用,控件首次挂载加载url属性时也会解析method属性并决定初始加载方式。在initState()中(L139-L142):

controller.setJavaScriptMode(JavaScriptMode.unrestricted).then((_) => _load( widget.control.getString("url", "https://flet.dev")!, parseLoadRequestMethod( widget.control.getString("method"), LoadRequestMethod.get)!));

可以看到默认 URL 为https://flet.dev,默认方法为LoadRequestMethod.get,与 Python 侧load_request的默认参数保持一致。

实战示例:在 Flet 应用中使用 RequestMethod

安装依赖

flet-webview是独立的扩展包,需要单独安装(参考 flet-webview/README.md):

# 使用 uv uv add flet-webview # 或使用 pip(之后需手动将包加入 requirements.txt 或 pyproject.toml) pip install flet-webview

基础用法:加载页面并监听生命周期事件

仓库自带的官方示例位于 web_view/main.py,展示了WebView的基本用法。在此基础上,配合load_request即可用指定 HTTP 方法加载页面:

import flet as ft import flet_webview as fwv from flet_webview import RequestMethod async def load_with_method(webview: fwv.WebView): # 使用 GET 方法加载(默认方法,可省略) await webview.load_request("https://example.com/page", method=RequestMethod.GET) # 使用 POST 方法加载,适合提交表单类页面 await webview.load_request( "https://example.com/search", method=RequestMethod.POST ) def main(page: ft.Page): def on_page_started(e): page.add(ft.Text(f"加载开始:{e.data}")) webview = fwv.WebView( url="https://flet.dev", on_page_started=on_page_started, expand=True, ) page.add(ft.SafeArea(expand=True, content=webview)) page.run_task(load_with_method, webview) if __name__ == "__main__": ft.run(main)

注意:load_request是异步方法,需在async函数中await调用;且仅当应用运行在 iOS、Android、macOS 上时才有效,请配合page.platform判断或直接在目标平台验证。

加载本地文件(method 被忽略)

await webview.load_request("file:///path/to/local/page.html")

传入file://地址时,无论method参数取值如何都会被忽略,WebView 会以本地文件方式加载,并使其同目录资源可读。该行为与直接调用WebView.load_file()(webview.py)等价。

平台支持与边界注意事项

flet-webview的官方平台支持矩阵(见 flet-webview/README.md 与 WebView 文档):

平台WindowsmacOSLinuxiOSAndroidWeb
支持

但需要区分两点:

  • 控件整体可用于 macOS、iOS、Android 与 Web;
  • load_request(以及大部分方法调用)仅支持 iOS、Android、macOS,Web 平台虽然能显示WebView,但调用load_request会触发_check_mobile_or_mac_platform()抛出的FletUnsupportedPlatformException

另外在 Android 上访问明文 HTTP 地址时,系统会默认拦截并报NET::ERR_CLEARTEXT_NOT_PERMITTED错误。若确需访问非 HTTPS 页面,需要在应用构建配置中开启明文流量许可,例如在pyproject.toml中写入(详见 WebView 文档的 Troubleshooting 章节):

[tool.flet.android.manifest_application] usesCleartextTraffic = "true"

与其他加载方式的关系

RequestMethod服务于"按需发起 HTTP 请求"这一场景,与WebView的其他加载入口分工明确:

加载方式适用场景是否支持自定义 HTTP 方法
url属性(构造时指定)控件挂载后自动加载初始页面可间接通过method属性指定(默认 GET)
load_request(url, method)运行时以指定方法加载http(s)://或本地文件支持,即本文的RequestMethod
load_file(path)加载本地 HTML 文件不适用(本地文件无 HTTP 方法语义)
load_html(value, base_url)直接渲染 HTML 字符串不适用(见 webview.py)

小结

RequestMethod虽仅有两个枚举成员,却是flet-webview中"以指定 HTTP 方法加载页面"这一能力的类型化入口:Python 侧负责 API 语义(types.py),经load_request()序列化后由 Flutter 侧parseLoadRequestMethod解析(utils/webview.dart),最终映射到webview_flutterWebViewController.loadRequest(webview_mobile_and_mac.dart)。掌握这一调用链,即可在 iOS、Android、macOS 的 Flet 应用中精确控制 WebView 的请求方法,同时规避file://与明文流量等边界陷阱。

  • 前端
  • 跨平台
  • 桌面应用
  • 移动开发

【免费下载链接】flet

Build realtime web, mobile and desktop apps in Python only. No frontend experience required.

项目地址:https://gitcode.com/gh_mirrors/fl/flet
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询