spec.rst 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. 服务器-客户端通信协议
  2. ==========================
  3. PyWebIO采用服务器-客户端架构,服务端运行任务代码,通过网络与客户端(也就是用户浏览器)交互
  4. 服务器与客户端有两种通信方式:WebSocket 和 Http 通信。
  5. 使用 Tornado或aiohttp 后端时,服务器与客户端通过 WebSocket 通信,使用 Flask或Django 后端时,服务器与客户端通过 Http 通信。
  6. **WebSocket 通信:**
  7. 服务器与客户端通过WebSocket连接发送json序列化之后的PyWebIO消息
  8. **Http 通信:**
  9. * 客户端通过Http GET请求向后端轮询,后端返回json序列化之后的PyWebIO消息列表
  10. * 当用户提交表单或者点击页面按钮后,客户端通过Http POST请求向后端提交数据
  11. 为方便区分,下文将由服务器向客户端发送的数据称作command,将客户端发向服务器的数据称作event
  12. 以下介绍command和event的格式
  13. Command
  14. ------------
  15. command由服务器->客户端,基本格式为::
  16. {
  17. "command": ""
  18. "task_id": ""
  19. "spec": {}
  20. }
  21. 各字段含义如下:
  22. * ``command`` 字段表示指令名
  23. * ``task_id`` 字段表示发送指令的Task id,客户端对于此命令的响应事件都会传递 task_id
  24. * ``spec`` 字段为指令的参数,不同指令参数不同
  25. 需要注意,以下不同命令的参数和 PyWebIO 的对应函数的参数大部分含义一致,但是也有些许不同。
  26. 以下分别对不同指令的 ``spec`` 字段进行说明:
  27. input_group
  28. ^^^^^^^^^^^^^^^
  29. 显示一个输入表单
  30. .. list-table:: ``spec`` 可用字段
  31. :header-rows: 1
  32. * - 字段
  33. - 是否必选
  34. - 类型
  35. - 字段说明
  36. * - label
  37. - False
  38. - str
  39. - 表单标题
  40. * - inputs
  41. - True
  42. - list
  43. - 输入项
  44. * - cancelable
  45. - False
  46. - bool
  47. - | 表单是否可以取消。
  48. | 若 ``cancelable=True`` 则会在表单底部显示一个"取消"按钮,
  49. | 用户点击取消按钮后,触发 ``from_cancel`` 事件
  50. ``inputs`` 字段为输入项组成的列表,每一输入项为一个 ``dict``,字段如下:
  51. * label: 输入标签名。必选
  52. * type: 输入类型。必选
  53. * name: 输入项id。必选
  54. * auto_focus: 自动获取输入焦点. 输入项列表中最多只能由一项的auto_focus为真
  55. * help_text: 帮助文字
  56. * 输入对应的html属性
  57. * 不同输入类型的特有属性
  58. 输入类型目前有:
  59. * text: 文本输入
  60. * number: 数字输入
  61. * password: 密码输入
  62. * checkbox: 多选项
  63. * radio: 单选项
  64. * select: 下拉选择框(可单选/多选)
  65. * textarea: 大段文本输入
  66. * file: 文件上传
  67. * actions: 如果表单最后一个输入元素为actions组件,则隐藏默认的"提交"/"重置"按钮
  68. 输入类型与html输入元素的对应关系:
  69. * text: input[type=text]
  70. * number: input[type=number]
  71. * password: input[type=password]
  72. * checkbox: input[type=checkbox]
  73. * radio: input[type=radio]
  74. * select: select https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/select
  75. * textarea: textarea https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/textarea
  76. * file: input[type=file]
  77. * actions: button[type=submit] https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/button
  78. 不同输入类型的特有属性:
  79. * text,number,password:
  80. * action: 在输入框一侧显示一个按钮。格式为 ``{label: 按钮标签, callback_id: 按钮回调id}``
  81. * textarea:
  82. * code: Codemirror 参数, 见 :func:`pywebio.input.textarea` 的 ``code`` 参数
  83. * select:
  84. * options: 选项列表 ``{label:选项标签, value: 选项值, [selected:是否默认选中,] [disabled:是否禁止选中]}``
  85. * checkbox:
  86. * options: 选项列表 ``{label:选项标签, value: 选项值, [selected:是否默认选中,] [disabled:是否禁止选中]}``
  87. * inline
  88. * radio:
  89. * options: 选项列表 ``{label:选项标签, value: 选项值, [selected:是否默认选中,] [disabled:是否禁止选中]}``
  90. * inline
  91. * actions
  92. * buttons: 选项列表。``{label:选项标签, value:选项值, [type: 按钮类型 'submit'/'reset'/'cancel'], [disabled:是否禁止选择]}`` .
  93. * file:
  94. * multiple: 是否允许多文件上传
  95. * max_size: 单个文件的最大大小,超过限制将会禁止上传
  96. * max_total_size: 所有文件的最大大小,超过限制将会禁止上传
  97. update_input
  98. ^^^^^^^^^^^^^^^
  99. 更新输入项,用于对当前显示表单中输入项的 ``spec`` 进行更新
  100. 命令 ``spec`` 可用字段:
  101. * target_name: str 输入项的name值
  102. * target_value: str,可选。 用于在checkbox, radio, actions输入中过滤input(这些类型的输入项包含多个html input元素)
  103. * attributes: dist 需要更新的内容
  104. * valid_status: 为bool时,表示设置输入值的有效性,通过/不通过; 为0时,表示清空valid_status标志
  105. * value: 输入项的值
  106. * placeholder:
  107. * invalid_feedback
  108. * valid_feedback
  109. * 输入项其他spec字段 // 不支持更新 inline 和 label 字段
  110. close_session
  111. ^^^^^^^^^^^^^^^
  112. 指示服务器端已经关闭连接。 ``spec`` 为空
  113. destroy_form
  114. ^^^^^^^^^^^^^^^
  115. 销毁当前表单。 ``spec`` 为空
  116. 表单在页面上提交之后不会自动销毁,需要使用此命令显式销毁
  117. output
  118. ^^^^^^^^^^^^^^^
  119. 输出内容
  120. 命令 ``spec`` 字段:
  121. * type: 内容类型
  122. * style: str 自定义样式
  123. * scope: str 内容输出的域的css选择器。若CSS选择器匹配到页面上的多个容器,则内容会输出到每个匹配到的容器
  124. * position: int 在输出域中输出的位置, 见 :ref:`输出函数的scope相关参数 <scope_param>`
  125. * 不同type时的特有字段
  126. ``type`` 的可选值及特有字段:
  127. * type: markdown
  128. * content: str
  129. * options: dict, `marked.js <https://github.com/markedjs/marked>`_ 选项
  130. * sanitize: bool, 是否使用 `DOMPurify <https://github.com/cure53/DOMPurify>`_ 对内容进行过滤来防止XSS攻击。
  131. * type: html
  132. * content: str:
  133. * sanitize: bool, 是否使用 `DOMPurify <https://github.com/cure53/DOMPurify>`_ 对内容进行过滤来防止XSS攻击。
  134. * type: text
  135. * content: str 输出的文本
  136. * inline: True/False 文本是否末尾换行
  137. * type: buttons
  138. * callback_id:
  139. * buttons:[ {value:, label:, [color:]},...]
  140. * small: bool,是否显示为小按钮样式
  141. * link: bool,是否显示为链接样式
  142. * type: file
  143. * name: 下载保存为的文件名
  144. * content: 文件base64编码的内容
  145. * type: table
  146. * data: 二维数组,表示表格数据,第一行为表头
  147. * span: 跨行/跨列的单元格信息,格式: {"[行id],[列id]": {"row":跨行数, "col":跨列数 }}
  148. popup
  149. ^^^^^^^^^^^^^^^
  150. 显示弹窗
  151. 命令 spec 字段:
  152. * title: 弹窗标题
  153. * content: 数组,元素为字符串/对象
  154. * size: 弹窗窗口大小,可选值: ``large`` 、 ``normal`` 、 ``small``
  155. * implicit_close: 是否可以通过点击弹窗外的内容或按下 `Esc` 键来关闭弹窗
  156. * closable: 是否可由用户关闭弹窗. 默认情况下,用户可以通过点击弹窗右上角的关闭按钮来关闭弹窗,
  157. 设置为 ``false`` 时弹窗仅能通过 ``popup_close`` command 关闭, ``implicit_close`` 参数被忽略.
  158. * dom_id: 弹窗内容区的dom id
  159. toast
  160. ^^^^^^^^^^^^^^^
  161. 显示通知消息
  162. 命令 spec 字段:
  163. * content: 通知内容
  164. * duration: 通知显示持续的时间,单位为毫秒
  165. * position: 通知消息显示的位置,可以为 `'left'` / `'center'` / `'right'`
  166. * color: 通知消息的背景颜色,格式为合法的css颜色值
  167. * callback_id: 点击通知消息时的回调函数callback_id, 没有回调时为 null
  168. close_popup
  169. ^^^^^^^^^^^^^^^
  170. 关闭正在显示的弹窗
  171. 该命令字段 ``spec`` 为 ``null``
  172. set_env
  173. ^^^^^^^^^^^^^^^
  174. 环境配置
  175. 命令 spec 字段:
  176. * title (str): 设定标题
  177. * output_animation (bool): 是否在输出内容时,使用过渡动画
  178. * auto_scroll_bottom (bool): 是否在内容输出时将页面自动滚动到底部
  179. * http_pull_interval (int): HTTP轮训后端消息的周期(单位为毫秒,默认1000ms),仅在使用HTTP的连接中可用
  180. output_ctl
  181. ^^^^^^^^^^^^^^^
  182. 输入控制
  183. 命令 spec 字段:
  184. * set_scope: 要创建的scope的名字
  185. * container: 新创建的scope的父scope的css选择器
  186. * position: 在父scope中创建此scope的位置. int, position>=0表示在父scope的第position个(从0计数)子元素的前面创建;position<0表示在父scope的倒数第position个(从-1计数)元素之后创建新scope
  187. * if_exist: scope已经存在时如何操作:
  188. - null/不指定时表示立即返回不进行任何操作
  189. - `'remove'` 表示先移除旧scope再创建新scope
  190. - `'clear'` 表示将旧scope的内容清除,不创建新scope
  191. * clear: 需要清空的scope的css选择器
  192. * clear_before
  193. * clear_after
  194. * clear_range:[,]
  195. * scroll_to:
  196. * position: top/middle/bottom 与scroll_to一起出现, 表示滚动页面,让scope位于屏幕可视区域顶部/中部/底部
  197. * remove: 将给定的scope连同scope处的内容移除
  198. run_script
  199. ^^^^^^^^^^^^^^^
  200. 运行js代码
  201. 命令 spec 字段:
  202. * code: 字符串格式的要运行的js代码
  203. * args: 传递给代码的局部变量。字典类型,字典键表示变量名,字典值表示变量值(变量值需要可以被json序列化)
  204. download
  205. ^^^^^^^^^^^^^^^
  206. 下载文件
  207. 命令 spec 字段:
  208. * name: 下载保存为的文件名
  209. * content: 文件base64编码的内容
  210. Event
  211. ------------
  212. 客户端->服务器,事件格式::
  213. {
  214. event: ""
  215. task_id: ""
  216. data: object/str
  217. }
  218. ``event`` 表示事件名称。 ``data`` 为事件所携带的数据,其根据事件不同内容也会不同,不同事件对应的 ``data`` 字段如下:
  219. input_event
  220. ^^^^^^^^^^^^^^^
  221. 表单发生更改时触发
  222. * event_name: ``'blur'``,表示输入项失去焦点
  223. * name: 输入项name
  224. * value: 输入项值
  225. 注意: checkbox_radio 不产生blur事件
  226. .. _callback_event:
  227. callback
  228. ^^^^^^^^^^^^^^^
  229. 用户点击显示区的按钮时触发
  230. 在 ``callback`` 事件中,``task_id`` 为对应的 ``button`` 组件的 ``callback_id`` 字段;
  231. 事件的 ``data`` 为被点击button的 ``value``
  232. from_submit
  233. ^^^^^^^^^^^^^^^
  234. 用户提交表单时触发
  235. 事件 ``data`` 字段为表单 ``name`` -> 表单值 的字典
  236. from_cancel
  237. ^^^^^^^^^^^^^^^
  238. 取消输入表单
  239. 事件 ``data`` 字段为 ``None``
  240. js_yield
  241. ^^^^^^^^^^^^^^^
  242. js代码提交数据
  243. 事件 ``data`` 字段为相应的数据