diff --git a/README.md b/README.md index 9bd0d2b8..0a203f54 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@

PyWebIO

- Write web app in script way. + Write interactive web app in script way.

@@ -34,7 +34,7 @@ PyWebIO还可以方便地整合进现有的Web服务,让你不需要编写Html - 代码侵入性小,对于旧脚本代码仅需修改输入输出逻辑 - 支持多用户与并发请求 - 支持结合第三方库实现数据可视化 -- 支持整合到现有的Web服务,目前支持与Tornado和Flask的集成 +- 支持整合到现有的Web服务,目前支持与Flask、Django、Tornado框架集成 - 同时支持基于线程的执行模型和基于协程的执行模型 diff --git a/docs/guide.rst b/docs/guide.rst index d36548f9..9b4d4c09 100644 --- a/docs/guide.rst +++ b/docs/guide.rst @@ -318,7 +318,9 @@ PyWebIO 目前支持与Flask和Tornado Web框架的集成。 from flask import Flask, send_from_directory app = Flask(__name__) - app.route('/io', methods=['GET', 'POST', 'OPTIONS'])(webio_view(task_func)) + + # task_func 为使用PyWebIO编写的任务函数 + app.add_url_rule('/io', 'webio_view', webio_view(target=task_func), methods=['GET', 'POST', 'OPTIONS']) @app.route('/') @app.route('/') @@ -327,30 +329,63 @@ PyWebIO 目前支持与Flask和Tornado Web框架的集成。 app.run(host='localhost', port=80) + .. tab:: Django + + 在django的路由配置文件 ``urls.py`` 中加入PyWebIO相关的路由即可:: + + # urls.py + + from functools import partial + from django.urls import path + from django.views.static import serve + from pywebio import STATIC_PATH + from pywebio.platform.django import webio_view + + # task_func 为使用PyWebIO编写的任务函数 + webio_view_func = webio_view(target=task_func) + + urlpatterns = [ + path(r"io", webio_view_func), + path(r'', partial(serve, path='index.html'), {'document_root': STATIC_PATH}), + path(r'', serve, {'document_root': STATIC_PATH}), + ] .. _integration_web_framework_note: 注意事项 ^^^^^^^^^^^ +**PyWebIO静态资源的托管** + +在开发阶段,使用后端框架提供的静态文件服务对于开发和调试都十分方便,上文的与Web框架集成的示例代码也都是使用了后端框架提供的静态文件服务。 +但出于性能考虑,托管静态文件最好的方式是使用 `反向代理 `_ (比如 `nginx `_ ) +或者 `CDN `_ 服务。 -PyWebIO默认通过当前页面的同级的 ``./io`` API与后端进行通讯,比如如果你将PyWebIO静态文件托管到 ``/A/B/C/(.*)`` 路径下,那么你需要将 -``webio_handler()`` 返回的 ``RequestHandler`` 绑定到 ``/A/B/C/io`` 处。如果你没有这样做的话,你需要在打开PyWebIO前端页面时, -传入 ``pywebio_api`` Url参数来指定PyWebIO后端API地址,比如 ``/A/B/C/?pywebio_api=/D/pywebio`` 将PyWebIO后端API地址设置到了 -``/D/pywebio`` 处。 ``pywebio_api`` 参数可以使用相对地址、绝对地址甚至指定其他服务器。 +**前端页面和后端接口的路径约定** + +PyWebIO默认通过当前页面的同级的 ``./io`` API与后端进行通讯。 + +例如你将PyWebIO静态文件托管到 ``/A/B/C/(.*)`` 路径下,那么你需要将PyWebIO API的路由绑定到 ``/A/B/C/io`` 处; +你也可以在PyWebIO前端页面使用 ``pywebio_api`` Url参数来指定PyWebIO后端API地址, +例如 ``/A/B/C/?pywebio_api=/D/pywebio`` 将PyWebIO后端API地址设置到了 ``/D/pywebio`` 处。 + +``pywebio_api`` 参数可以使用相对地址、绝对地址甚至指定其他服务器。 如果你不想自己托管静态文件,你可以使用PyWebIO的Github Page页面: ``https://wang0618.github.io/PyWebIO/pywebio/html/?pywebio_api=`` ,需要在页面上通过 ``pywebio_api`` 参数传入后端API地址,并且将 ``https://wang0618.github.io`` 加入 ``allowed_origins`` 列表中(见下文说明)。 .. caution:: 需要注意 ``pywebio_api`` 参数的格式: - 相对地址可以为 ``./xxx/xxx`` 或 ``xxx/xxx`` 的格式 - 绝对地址以 ``/`` 开头,比如 ``/aaa/bbb`` - 指定其他服务器需要使用完整格式: ``ws://example.com:8080/aaa/io`` ,或者省略协议字段: ``//example.com:8080/aaa/io`` 。 - 省略协议字段时,PyWebIO根据当前页面的协议确定要使用的协议: 若当前页面为http协议,则后端接口为ws协议;若当前页面为https协议,则后端接口为wss协议; - - 当后端API与当前页面不再同一host下时,需要在 `webio_handler() ` 或 - `webio_view() ` 中使用 ``allowed_origins`` 或 ``check_origin`` - 参数来允许后端接收页面所在的host + + * 相对地址可以为 ``./xxx/xxx`` 或 ``xxx/xxx`` 的相对地址格式。 + * 绝对地址以 ``/`` 开头,比如 ``/aaa/bbb`` . + * 指定其他服务器需要使用完整格式: ``http://example.com:5000/aaa/io`` 、 ``ws://example.com:8080/bbb/ws_io`` ,或者省略协议字段: ``//example.com:8080/aaa/io`` 。省略协议字段时,PyWebIO根据当前页面的协议确定要使用的协议: 若当前页面为http协议,则后端接口为http/ws协议;若当前页面为https协议,则后端接口为https/wss协议。 + + +**跨域配置** + +当后端API与当前页面不再同一host下时,需要在 `webio_handler() ` 或 +`webio_view() ` 中使用 ``allowed_origins`` 或 ``check_origin`` +参数来使后端接受前端页面的请求。 .. _coroutine_based_session: diff --git a/pywebio/platform/__init__.py b/pywebio/platform/__init__.py index eeb1d202..6d3f5697 100644 --- a/pywebio/platform/__init__.py +++ b/pywebio/platform/__init__.py @@ -14,6 +14,13 @@ .. autofunction:: pywebio.platform.flask.start_server +Django相关 +-------------- + +.. autofunction:: pywebio.platform.django.webio_view + +.. autofunction:: pywebio.platform.django.start_server + 其他 -------------- .. autofunction:: pywebio.platform.httpbased.run_event_loop