spec.rst 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. Server-Client communication protocol
  2. ========================================
  3. PyWebIO uses a server-client architecture, the server executes task code, and interacts with the client (that is, the user browser) through the network. This section introduce the protocol specification for the communication between PyWebIO server and client.
  4. There are two communication methods between server and client: WebSocket and Http.
  5. When using Tornado or aiohttp backend, the server and client communicate through WebSocket, when using Flask or Django backend, the server and client communicate through Http.
  6. **WebSocket communication**
  7. The server and the client send json-serialized message through WebSocket connection
  8. **Http communication**
  9. * The client polls the backend through Http GET requests, and the backend returns a list of PyWebIO messages serialized in json
  10. * When the user submits the form or clicks the button, the client submits data to the backend through Http POST request
  11. In the following, the data sent by the server to the client is called command, and the data sent by the client to the server is called event.
  12. The following describes the format of command and event
  13. Command
  14. ------------
  15. Command is sent by the server to the client. The basic format of command is::
  16. {
  17. "command": ""
  18. "task_id": ""
  19. "spec": {}
  20. }
  21. Each fields are described as follows:
  22. * ``command`` : command name
  23. * ``task_id`` : Id of the task that send the command
  24. * ``spec`` : the data of the command, which is different depending on the command name
  25. Note that: the arguments shown above are merely the same with the parameters of corresponding PyWebIO functions,
  26. but there are some differences.
  27. The following describes the ``spec`` fields of different commands:
  28. input_group
  29. ^^^^^^^^^^^^^^^
  30. Show a form in user's browser.
  31. .. list-table:: fields of ``spec``
  32. :header-rows: 1
  33. * - Field
  34. - Required
  35. - Type
  36. - Description
  37. * - label
  38. - False
  39. - str
  40. - Title of the form
  41. * - inputs
  42. - True
  43. - list
  44. - Input items
  45. * - cancelable
  46. - False
  47. - bool
  48. - | Whether the form can be cancelled。
  49. | If cancelable=True, a “Cancel” button will be displayed at the bottom of the form.
  50. | A ``from_cancel`` event is triggered after the user clicks the cancel button.
  51. The ``inputs`` field is a list of input items, each input item is a ``dict``, the fields of the item are as follows:
  52. * label: Label of input field, required.
  53. * type: Input type, required.
  54. * name: Identifier of the input field, required.
  55. * auto_focus: Set focus automatically. At most one item of ``auto_focus`` can be true in the input item list
  56. * help_text: Help text for the input
  57. * Additional HTML attribute of the input element
  58. * Other attributes of different input types
  59. Currently supported ``type`` are:
  60. * text: Plain text input
  61. * number: Number input
  62. * password: Password input
  63. * checkbox: Checkbox
  64. * radio: Radio
  65. * select: Drop-down selection
  66. * textarea: Multi-line text input
  67. * file: File uploading
  68. * actions: Actions selection.
  69. Correspondence between different input types and html input elements:
  70. * text: input[type=text]
  71. * number: input[type=number]
  72. * password: input[type=password]
  73. * checkbox: input[type=checkbox]
  74. * radio: input[type=radio]
  75. * select: select https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/select
  76. * textarea: textarea https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/textarea
  77. * file: input[type=file]
  78. * actions: button[type=submit] https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/button
  79. Unique attributes of different input types:
  80. * text,number,password:
  81. * action: Display a button on the right of the input field.
  82. The format of ``action`` is ``{label: button label, callback_id: button click callback id}``
  83. * textarea:
  84. * code: Codemirror options, same as ``code`` parameter of :func:`pywebio.input.textarea`
  85. * select:
  86. * options: ``{label:, value: , [selected:,] [disabled:]}``
  87. * checkbox:
  88. * options: ``{label:, value: , [selected:,] [disabled:]}``
  89. * inline
  90. * radio:
  91. * options: ``{label:, value: , [selected:,] [disabled:]}``
  92. * inline
  93. * actions
  94. * buttons: ``{label:, value:, [type: 'submit'/'reset'/'cancel'], [disabled:]}`` .
  95. * file:
  96. * multiple: Whether to allow upload multiple files.
  97. * max_size: The maximum size of a single file, in bytes.
  98. * max_total_size: The maximum size of all files, in bytes.
  99. update_input
  100. ^^^^^^^^^^^^^^^
  101. Update the input item, you can update the ``spec`` of the input item of the currently displayed form
  102. The ``spec`` fields of ``update_input`` commands:
  103. * target_name: str The name of the target input item.
  104. * target_value: str, optional. Used to filter options in checkbox, radio, actions type
  105. * attributes: dist, fields need to be updated
  106. * valid_status: When it is bool, it means setting the state of the input value, pass/fail; when it is 0, it means clear the valid_status flag
  107. * value: Set the value of the item
  108. * placeholder
  109. * invalid_feedback
  110. * valid_feedback
  111. * other fields of item's ``spec`` // not support to inline and label fields
  112. close_session
  113. ^^^^^^^^^^^^^^^
  114. Indicates that the server has closed the connection. ``spec`` of the command is empty.
  115. destroy_form
  116. ^^^^^^^^^^^^^^^
  117. Destroy the current form. ``spec`` of the command is empty.
  118. Note: The form will not be automatically destroyed after it is submitted, it needs to be explicitly destroyed using this command
  119. output
  120. ^^^^^^^^^^^^^^^
  121. Output content
  122. The ``spec`` fields of ``output`` commands:
  123. * type: content type
  124. * style: str, Additional css style
  125. * scope: str, CSS selector of the output container. If multiple containers are matched, the content will be output to every matched container
  126. * position: int, see :ref:`scope - User manual <scope_param>`
  127. * Other attributes of different types
  128. Unique attributes of different types:
  129. * type: markdown
  130. * content: str
  131. * options: dict, `marked.js <https://github.com/markedjs/marked>`_ options
  132. * sanitize: bool, Whether to enable a XSS sanitizer for HTML
  133. * type: html
  134. * content: str
  135. * sanitize: bool, Whether to enable a XSS sanitizer for HTML
  136. * type: text
  137. * content: str
  138. * inline: bool, Use text as an inline element (no line break at the end of the text)
  139. * type: buttons
  140. * callback_id:
  141. * buttons:[ {value:, label:, [color:]},...]
  142. * small: bool, Whether to enable small button
  143. * link: bool, Whether to make button seem as link.
  144. * type: file
  145. * name: File name when downloading
  146. * content: File content with base64 encoded
  147. * type: table
  148. * data: Table data, which is a two-dimensional list, the first row is table header.
  149. * span: cell span info. Format: {"[row id],[col id]": {"row":row span, "col":col span }}
  150. popup
  151. ^^^^^^^^^^^^^^^
  152. Show popup
  153. The ``spec`` fields of ``popup`` commands:
  154. * title
  155. * content
  156. * size: ``large``, ``normal``, ``small``
  157. * implicit_close
  158. * closable
  159. * dom_id: DOM id of popup container element
  160. toast
  161. ^^^^^^^^^^^^^^^
  162. Show a notification message
  163. The ``spec`` fields of ``popup`` commands:
  164. * content
  165. * duration
  166. * position: `'left'` / `'center'` / `'right'`
  167. * color: hexadecimal color value starting with '#'
  168. * callback_id
  169. close_popup
  170. ^^^^^^^^^^^^^^^
  171. Close the current popup window.
  172. ``spec`` of the command is empty.
  173. set_env
  174. ^^^^^^^^^^^^^^^
  175. Config the environment of current session.
  176. The ``spec`` fields of ``set_env`` commands:
  177. * title (str)
  178. * output_animation (bool)
  179. * auto_scroll_bottom (bool)
  180. * http_pull_interval (int)
  181. output_ctl
  182. ^^^^^^^^^^^^^^^
  183. Output control
  184. The ``spec`` fields of ``output_ctl`` commands:
  185. * set_scope: scope name
  186. * container: Specify css selector to the parent scope of target scope.
  187. * position: int, The index where this scope is created in the parent scope.
  188. * if_exist: What to do when the specified scope already exists:
  189. - null: Do nothing
  190. - `'remove'`: Remove the old scope first and then create a new one
  191. - `'clear'`: Just clear the contents of the old scope, but don’t create a new scope
  192. * clear: css selector of the scope need to clear
  193. * clear_before
  194. * clear_after
  195. * clear_range:[,]
  196. * scroll_to
  197. * position: top/middle/bottom, Where to place the scope in the visible area of the page
  198. * remove: Remove the specified scope
  199. run_script
  200. ^^^^^^^^^^^^^^^
  201. run javascript code in user's browser
  202. The ``spec`` fields of ``run_script`` commands:
  203. * code: str, code
  204. * args: dict, Local variables passed to js code
  205. download
  206. ^^^^^^^^^^^^^^^
  207. Send file to user
  208. The ``spec`` fields of ``download`` commands:
  209. * name: str, File name when downloading
  210. * content: str, File content in base64 encoding.
  211. Event
  212. ------------
  213. Event is sent by the client to the server. The basic format of event is::
  214. {
  215. event: event name
  216. task_id: ""
  217. data: object/str
  218. }
  219. The ``data`` field is the data carried by the event, and its content varies according to the event.
  220. The ``data`` field of different events is as follows:
  221. input_event
  222. ^^^^^^^^^^^^^^^
  223. Triggered when the form changes
  224. * event_name: Current available value is ``'blur'``, which indicates that the input item loses focus
  225. * name: name of input item
  226. * value: value of input item
  227. note: checkbox and radio do not generate blur events
  228. .. _callback_event:
  229. callback
  230. ^^^^^^^^^^^^^^^
  231. Triggered when the user clicks the button in the page
  232. In the ``callback`` event, ``task_id`` is the ``callback_id`` field of the ``button``;
  233. The ``data`` of the event is the ``value`` of the button that was clicked
  234. from_submit
  235. ^^^^^^^^^^^^^^^
  236. Triggered when the user submits the form
  237. The ``data`` of the event is a dict, whose key is the name of the input item, and whose value is the value of the input item.
  238. from_cancel
  239. ^^^^^^^^^^^^^^^
  240. Cancel input form
  241. The ``data`` of the event is ``None``
  242. js_yield
  243. ^^^^^^^^^^^^^^^
  244. submit data from js
  245. The ``data`` of the event is the data need to submit