1
0

spec.rst 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. 服务器-客户端通信协议
  2. ==========================
  3. PyWebIO采用服务器-客户端架构,服务端运行任务代码,通过网络与客户端(也就是用户浏览器)交互
  4. 服务器与客户端有两种国内通信方式:WebSocket 和 Http 通信。
  5. 使用 Tornado 后端时,服务器与客户端通过 WebSocket 通信,使用 Flask 后端时,服务器与客户端通过 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. 其中 command 字段表示指令名
  22. task_id 字段表示发送指令的Task id,客户端对于此命令的响应事件都会传递 task_id
  23. spec 字段为指令的一些参数,不同指令参数不同
  24. 需要注意,以下不同命令的参数和对应的 PyWebIO 的对应函数大部分一致,但是也有些许不同。
  25. 以下分别对不同指令的参数进行说明:
  26. input_group:
  27. ^^^^^^^^^^^^^^^
  28. 显示一个输入表单
  29. .. list-table:: ``spec`` 可用字段
  30. :header-rows: 1
  31. * - 字段
  32. - 是否必选
  33. - 类型
  34. - 字段说明
  35. * - label
  36. - False
  37. - str
  38. - 表单标题
  39. * - inputs
  40. - True
  41. - list
  42. - 输入项
  43. * - cancelable
  44. - False
  45. - bool
  46. - | 表单是否可以取消。
  47. | 若 ``cancelable=True`` 则会在表单底部显示一个"取消"按钮,
  48. | 用户点击取消按钮后,触发 ``from_cancel`` 事件
  49. ``inputs`` 字段为输入项组成的列表,每一输入项为一个 ``dict``,字段如下:
  50. * label: 输入标签名。必选
  51. * type: 输入类型。必选
  52. * name: 输入项id。必选
  53. * auto_focus
  54. * help_text
  55. * 输入对应的html属性
  56. * 不同输入类型的特有属性
  57. 输入类型目前有:
  58. * text
  59. * number
  60. * password
  61. * checkbox
  62. * radio
  63. * select
  64. * textarea
  65. * file
  66. * actions: 如果表单最后一个输入元素为actions组件,则隐藏默认的"提交"/"重置"按钮
  67. 输入类型与html输入元素的对应关系:
  68. * text: input[type=text]
  69. * number: input[type=number]
  70. * password: input[type=password]
  71. * checkbox: input[type=checkbox]
  72. * radio: input[type=radio]
  73. * select: select https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/select
  74. * textarea: textarea https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/textarea
  75. * file: input[type=file]
  76. * actions: button[type=submit] https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/button
  77. 输入类型的特有属性:
  78. * textarea:
  79. * code:
  80. * select:
  81. * options: 选项列表 ``{label:选项标签, value: 选项值, [selected:是否默认选中,] [disabled:是否禁止选中]}``
  82. * checkbox:
  83. * options: 选项列表 ``{label:选项标签, value: 选项值, [selected:是否默认选中,] [disabled:是否禁止选中]}``
  84. * inline
  85. * radio:
  86. * options: 选项列表 ``{label:选项标签, value: 选项值, [selected:是否默认选中,] [disabled:是否禁止选中]}``
  87. * inline
  88. * actions
  89. * buttons: 选项列表。``{label:选项标签, value:选项值, [type: 按钮类型 'submit'/'reset'/'cancel'], [disabled:是否禁止选择]}``
  90. update_input:
  91. ^^^^^^^^^^^^^^^
  92. 更新输入项,用于对当前显示表单中输入项的spec进行更新
  93. 命令 spec 可用字段:
  94. * target_name: input主键name
  95. * target_value:str,可选。 用于在checkbox, radio, actions输入中过滤input(这些输入类型,包含多个html input元素)
  96. * attributes: 更新内容 dist
  97. * valid_status: bool 输入值的有效性,通过/不通过
  98. * value:
  99. * placeholder:
  100. * invalid_feedback
  101. * valid_feedback
  102. * 输入项spec字段 // 不支持更新 on_focus on_blur inline label 字段
  103. close_session:
  104. ^^^^^^^^^^^^^^^
  105. 用于服务器端关闭连接。无spec
  106. destroy_form:
  107. ^^^^^^^^^^^^^^^
  108. 销毁当前表单。无spec
  109. 表单在页面上提交之后不会自动销毁,需要使用此命令显式销毁
  110. output:
  111. ^^^^^^^^^^^^^^^
  112. 输入内容
  113. 命令 spec 字段:
  114. * type
  115. * before
  116. * after
  117. * anchor
  118. * 不同type时的特有字段
  119. 不同 ``type`` 时的特有字段:
  120. * type: markdown, html
  121. * content: ''
  122. * type: text
  123. * inline: True/False
  124. * content: ''
  125. * type: buttons
  126. * callback_id:
  127. * buttons:[ {value:, label:, },...]
  128. * small:
  129. * type: file
  130. * name:
  131. * content:
  132. * type: table
  133. * data: 二维数组,表示表格数据,第一行为表头
  134. * span: 跨行/跨列的单元格信息,格式: {"[行id],[列id]": {"row":跨行数, "col":跨列数 }}
  135. output_ctl:
  136. ^^^^^^^^^^^^^^^
  137. 输入控制
  138. 命令 spec 字段:
  139. * title: 设定标题
  140. * output_fixed_height: 设置是否输出区固定高度
  141. * auto_scroll_bottom: 设置有新内容时是否自动滚动到底部
  142. * set_anchor
  143. * clear_before
  144. * clear_after
  145. * clear_range:[,]
  146. * scroll_to:
  147. * position: top/middle/bottom 与scroll_to一起出现, 表示滚动页面,让锚点位于屏幕可视区域顶部/中部/底部
  148. * remove: 将给定的锚点连同锚点处的内容移除
  149. Event
  150. ------------
  151. 客户端->服务器,事件格式::
  152. {
  153. event: ""
  154. task_id: ""
  155. data: object/str
  156. }
  157. ``event`` 表示事件名称。 ``data`` 为事件所携带的数据,其根据事件不同内容也会不同,不同事件对应的 ``data`` 字段如下:
  158. input_event
  159. ^^^^^^^^^^^^^^^
  160. 表单发生更改时触发
  161. * event_name: ``'blur'``,表示输入项失去焦点
  162. * name: 输入项name
  163. * value: 输入项值
  164. 注意: checkbox_radio 不产生blur事件
  165. callback
  166. ^^^^^^^^^^^^^^^
  167. 用户点击显示区的按钮时触发
  168. 在 ``callback`` 事件中,``task_id`` 为对应的 ``button`` 组件的 ``callback_id`` 字段;
  169. 事件的 ``data`` 为被点击button的 ``value``
  170. from_submit:
  171. ^^^^^^^^^^^^^^^
  172. 用户提交表单时触发
  173. 事件 ``data`` 字段为表单 ``name`` -> 表单值 的字典
  174. from_cancel:
  175. ^^^^^^^^^^^^^^^
  176. 取消输入表单
  177. 事件 ``data`` 字段为 ``None``