Bottle和HTML如何双向通信?
我正在尝试将 bottle.py 和 twitter bootstrap 一起使用,来制作一个小网站。我需要在 HTML 的不同位置插入一些数据,用 Python 来实现,但我不太明白 HTML 和 Python 是怎么沟通的。
这里有一个关于 twitter 和 bottle 一起工作的例子。
他提到在 HTML 中链接了一些 .js 文件,我能看到他是怎么做的,但我不太明白这对 Python 和 HTML 的互动有什么影响。是否有 JavaScript 的回调,Python 是通过 request.GET.get().strip():
来捕捉的呢?
另外,最后一行是:
return template('templates/gpio.tpl', colour1=colour1, colour2=colour2, colour3=colour3)
我不太确定 templates/gpio.tpl
是怎么和他下面提到的 HTML 连接起来的。我知道颜色变量在 HTML 中被引用(我猜这用的是 {{}} 语法),但我不太明白 HTML 是怎么被调用的。
根据我的理解(目前还不是很多),大概是这样:
- 用户在浏览器中输入 "server:port/gpio"
- bottle 调用 Python 装饰器,运行函数并返回底部的模板。
- 这时我就困惑了。
- A) Python 脚本是怎么知道要调用 HTML 的?
- B) gpio.tpl 模板代码是怎么发送到 HTML 的?
- C) 可以安全地假设发送到模板函数的 Python 参数可以用 {{}} 语法引用吗,还是说还有其他的?
- D) HTML 是怎么回调 Python 来更新他在底部展示的按钮的?
- D.1) 最上面链接的 JS 和这个有关吗?
最后:如果有人有其他更好的例子来链接 bootstrap 和 bottle,我会很高兴看到。
这是一篇内容很丰富的帖子。谢谢你的耐心。:D
相关文章:
- 暂无相关问题
2 个回答
如果我想做一个 HTML 按钮,点击后能改变页面上的某些内容,我该怎么把这个反馈发回 bottle.py,让页面更新呢?
这要看你想改变什么……
比如,点击按钮可以触发一个新的 HTTP 请求,这样你就需要在代码里定义一个新的功能。
我们以之前的例子为基础,假设你想添加一个 switchOff 按钮。
你需要在 gpio.tpl 文件中的某个地方添加以下按钮:
<input type="submit" class="btn" name="LedsOff" value="Turn off the leds!">
然后,修改 gpio() 函数,添加一个新的条件,代码如下:
elif request.GET.get('LedsOff','').strip():
from quick2wire.gpio import Pin, exported
with exported(Pin(12, Pin.Out)) as out1, exported(Pin(13, Pin.Out)) as out2:
out1.value = 0
out2.value = 0
首先,你需要了解一下HTTP协议是怎么工作的……不过我们先来快速回答你的主要问题:
HTML和Python是怎么交流的
简单来说:它们并没有直接交流。发生的事情是:
- 你的客户端(通常是浏览器)向你的网站发送一个HTTP请求。
- 前端的网络服务器(比如Apache、Nginx等)把这个请求转发给bottle.py应用。
- bottle.py应用根据请求的URL路径和请求的方法,把请求交给合适的控制器函数处理。
- 控制器函数完成它的工作后,会返回一个HTTP响应给前端网络服务器。
- 前端网络服务器再把这个响应发送给你的客户端。
通常情况下——但不一定——这个HTTP响应包含了由控制器使用模板生成的HTML内容。换句话说:bottle.py使用模板来生成发送回客户端的HTML。
一旦响应发送出去,直到客户端发送另一个请求之前,就没有更多的“交流”了。