技术方案:
-
💎 flask + dominate/domonic + brython + pico css 近期的亮点:
-
🚫 flask + dominate/domonic + pyscript + pico css 不采用理由:
- pyscript 网络请求量大, 初次加载非常慢.
- pyscript 缺少完全离线的使用方式 (没有官方文档指导 + 没有开源示例 + 自己多种尝试均告失败).
- pyscript 的 debug 体验差.
Flask + Dominate / Domonic + Brython + Pico CSS 方案详解
-
flask: 服务器, 路由, 静态资源系统 -
dominate / domonic: 使用 python 语法快速生成 (静态) html 算是手写 html 或者 html template 之外的又一种选择吧. 个人很喜欢这种方式. -
brython: 在 html 中写 python, 替代 “text/javascript” -
pico css (可选): 纯 css 主题库. 轻量的 html 美化方案
示例代码
目录结构:
- demo:
- static:
- brython.js
- brython_stdlib.js
- pico.min.css
- main.py
- requirements.py: |
dominate
flask
main.py 源代码:
from textwrap import dedent
from dominate import document
from dominate import tags as t
from flask import Flask
app = Flask('flask_brython_test')
@app.route('/')
def index():
doc = document(title='Flask Brython Test')
with doc.head:
t.link(rel='stylesheet', href='/static/pico.min.css')
t.script(type='text/javascript', src='/static/brython.js')
t.script(type='text/javascript', src='/static/brython_stdlib.js')
with doc.body:
doc.body['onload'] = 'brython()'
doc.body['data-theme'] = 'dark'
doc.body['class'] = 'container'
with t.input_(id='zone'):
pass
with t.button('click me', id='mybtn'):
pass
with t.script(type='text/python') as s:
s += dedent('''
from browser import document, alert
def echo(event):
print('the printed message will be shown in '
'browser console', event)
alert(document['zone'].value)
document['mybtn'].bind('click', echo)
''')
return doc.render()
if __name__ == '__main__':
app.run(debug=True)
运行截图:
|