README.rst 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. PyWebIO
  2. ==================
  3. PyWebIO是一个用于在浏览器上获取输入和进行输出的工具库。能够将原有的通过终端交互的脚本快速服务化,供其他人在网络上通过浏览器访问使用;PyWebIO还可以方便地整合进现有的Web服务,非常适合于构建对UI要求不高的后端服务。
  4. 特点:
  5. - 使用同步而不是基于回调的方式获取输入,无需在各个步骤之间保存状态,使用更方便
  6. - 代码侵入性小,对于旧脚本代码仅需修改输入输出逻辑
  7. - 支持多用户与并发请求
  8. - 支持整合到现有的Web服务,目前支持与Tornado和Flask的集成
  9. - 同时支持基于线程的执行模型和基于协程的执行模型
  10. Install
  11. ------------
  12. .. code-block:: bash
  13. pip3 install pywebio
  14. Quick start
  15. ------------
  16. 假设你编写了如下脚本来计算 `BMI指数 <https://en.wikipedia.org/wiki/Body_mass_index>`_ :
  17. .. code-block:: python
  18. # BMI.py
  19. def bmi():
  20. height = input("请输入你的身高(cm):")
  21. weight = input("请输入你的体重(kg):")
  22. BMI = float(weight) / (float(height) / 100) ** 2
  23. top_status = [(14.9, '极瘦'), (18.4, '偏瘦'),
  24. (22.9, '正常'), (27.5, '过重'),
  25. (40.0, '肥胖'), (float('inf'), '非常肥胖')]
  26. for top, status in top_status:
  27. if BMI <= top:
  28. print('你的 BMI 值: %.1f,身体状态:%s' % (BMI, status))
  29. break
  30. if __name__ == '__main__':
  31. bmi()
  32. **在浏览器中进行输入输出**
  33. 只需将输入输出函数替换成PyWebIO的输入输出函数就完成了改造(下面代码通过注释标出了改动部分)
  34. .. code-block:: python
  35. # BMI.py
  36. from pywebio.input import input # Change 1
  37. from pywebio.output import put_text # Change 1
  38. def bmi():
  39. height = input("请输入你的身高(cm):") # Change 2
  40. weight = input("请输入你的体重(kg):") # Change 2
  41. BMI = float(weight) / (float(height) / 100) ** 2
  42. top_status = [(14.9, '极瘦'), (18.4, '偏瘦'),
  43. (22.9, '正常'), (27.5, '过重'),
  44. (40.0, '肥胖'), (float('inf'), '非常肥胖')]
  45. for top, status in top_status:
  46. if BMI <= top:
  47. put_text('你的 BMI 值: %.1f,身体状态:%s' % (BMI, status)) # Change 3
  48. break
  49. if __name__ == '__main__':
  50. bmi()
  51. 运行代码就可以在自动弹出的浏览器中与代码交互了:
  52. .. image:: /docs/assets/demo.gif
  53. **向外提供服务**
  54. 上文对使用PyWebIO进行改造的程序,运行模式还是脚本,程序计算完毕后立刻退出。可以使用 ``pywebio.start_server`` 将程序功能作为Web服务提供:
  55. .. code-block:: python
  56. # BMI.py
  57. from pywebio import start_server
  58. from pywebio.input import input
  59. from pywebio.output import put_text
  60. def bmi():
  61. height = input("请输入你的身高(cm):")
  62. weight = input("请输入你的体重(kg):")
  63. BMI = float(weight) / (float(height) / 100) ** 2
  64. top_status = [(14.9, '极瘦'), (18.4, '偏瘦'),
  65. (22.9, '正常'), (27.5, '过重'),
  66. (40.0, '肥胖'), (float('inf'), '非常肥胖')]
  67. for top, status in top_status:
  68. if BMI <= top:
  69. put_text('你的 BMI 值: %.1f,身体状态:%s' % (BMI, status))
  70. break
  71. if __name__ == '__main__':
  72. start_server(bmi)
  73. **与现有Web框架整合**
  74. 仅需在现有的Tornado应用中加入加入两个 ``RequestHandler`` ,就可以将使用PyWebIO编写的函数整合进 ``Tornado`` 应用中了
  75. .. code-block:: python
  76. import tornado.ioloop
  77. import tornado.web
  78. from pywebio.platform.tornado import webio_handler
  79. from pywebio import STATIC_PATH
  80. class MainHandler(tornado.web.RequestHandler):
  81. def get(self):
  82. self.write("Hello, world")
  83. if __name__ == "__main__":
  84. application = tornado.web.Application([
  85. (r"/", MainHandler),
  86. (r"/bmi/io", webio_handler(bmi)), # bmi 即为上文中使用`PyWebIO`进行改造的函数
  87. (r"/bmi/(.*)", tornado.web.StaticFileHandler, {"path": STATIC_PATH, 'default_filename': 'index.html'})
  88. ])
  89. application.listen(port=80, address='localhost')
  90. tornado.ioloop.IOLoop.current().start()
  91. 在 ``http://localhost/bmi/`` 页面上就可以计算BMI了
  92. 文档
  93. ------------
  94. 使用手册和开发文档见 `https://pywebio.readthedocs.io <https://pywebio.readthedocs.io>`_