Flask系列
不写一行Javascript实现省市区三级联动
通过GitHub快速部署Flask App 到 Heroku Cloud
在 Heroku 上部署 Python Flask App
用Flask来渲染Markdown
Python开发的Web应用方便分发吗?
今天要给大家介绍一个非常牛的 JavaScript 库,htmx[1]。
htmx 允许你使用属性直接在 HTML 中访问 AJAX、CSS 转换、WebSockets 和服务器发送事件,所以你可以用超文本的简单和强大构建现代用户界面
htmx 很小(~10k min.gz),无依赖,可扩展,兼容 IE11。
今天就给大家介绍下它的一个应用,不写一行 Javascript 代码,实现省市区 3 级联动的例子,后台可以选择你擅长的,今天我仍然使用 Flask。
index.html
<html>
<header>
<script src="https://unpkg.com/htmx.org@1.6.1"
integrity="sha384-tvG/2mnCFmGQzYC1Oh3qxQ7CkQ9kMzYjWZSNtrRZygHPDDqottzEJsqS4oUVodhW"
crossorigin="anonymous"></script>
<style>
div {
border-style: solid;
border-color: rgb(3, 3, 122);
border-width: 5px;
margin-right: 10px;
padding-top: 20px;
padding-left: 20px;
font-size: x-large;
height: 60px;
width:300px;
float: left;
}
</style>
</header>
<body>
<div>
<label>Province</label>
<select name="province" hx-get="/cities/"
hx-target="#cities" hx-indicator=".htmx-indicator"
id ="provinces" hx-trigger="change, load" >
{% for province in provinces %}
<option value="{{ province.code }}">{{ province.name }}</option>
{% endfor %}
</select>
</div>
<div>
<label>City</label>
<select id="cities" name="city" hx-get="/areas/"
hx-trigger="change, htmx:afterSettle" hx-target="#areas"
hx-indicator=".htmx-indicator">
{% for city in cities %}
<option value="{{ city.code }}">{{ city.name }}</option>
{% endfor %}
</select>
</div>
<div>
<label>Area</label>
<select id="areas">
{% for area in areas %}
<option value="{{ area.code }}">{{ area.name }}</option>
{% endfor %}
</select>
</div>
</body>
</html>复制
从上面的 html 模版代码可以看到,我们需要引入一个 html js 库
<select name="province" hx-get="/cities/"
hx-target="#cities" hx-indicator=".htmx-indicator"
id ="provinces" hx-trigger="change, load" >复制
这个 select tag 比 标准 html 多了些内容
hx-get="/cities/"
发送GET
请求到/cities/
hx-target="#cities"
刷新目标,本文是刷新 id 为cities
tag.hx-indicator=".htmx-indicator"
发送 AJAX 请求时,让用户知道后台正在 执行hx-trigger="change, load" 触发条件, 当内容改变和加载的时候触发
app.py
from flask import Flask, render_template, request,render_template_string
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config.from_object("config")
db = SQLAlchemy(app)
@app.route('/')
@app.route('/index.html')
def index():
provinces = db.session.execute("SELECT * FROM province order by code")
return render_template('index.html', provinces=provinces)
@app.route('/cities/', methods=['GET'])
def get_cities():
templ = """
{%for city in cities %}
<option value="{{ city.code }}">{{ city.name }}</option>
{% endfor %}
"""
province = request.args.get("province")
cities = db.session.execute("SELECT * FROM city WHERE provinceCode=:province",{"province":province})
return render_template_string(templ, cities=cities)
@app.route('/areas/', methods=['GET'])
def get_areas():
templ = """
{%for area in areas %}
<option value="{{ area.code }}">{{ area.name }}</option>
{% endfor %}
"""
city = request.args.get("city")
areas = db.session.execute("SELECT * FROM area WHERE cityCode=:city",{"city":city})
return render_template_string(templ, areas=areas)复制
后台代码非常简单,没有啥好说的,想要完整代码的可以访问
https://github.com/alitrack/flask
参考资料
htmx: https://htmx.org/
文章转载自alitrack,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
Java萌新修炼手册⑥:面向对象の修仙奥义——从"散修"到"宗门大佬"的基因飞升!
让天下没有难学的编程
46次阅读
2025-04-25 10:10:40
Java萌新修炼手册②:Hello Worldの108种写法——从入门到入坟!
让天下没有难学的编程
46次阅读
2025-04-21 10:34:36
从 Java 到 Go:面向对象的巨人与云原生的轻骑兵
京东云开发者
37次阅读
2025-04-25 11:41:37
Java萌新修炼手册⑤:数组の千层套路——从"鸽子笼"到"摩天楼"的进阶之路!
让天下没有难学的编程
34次阅读
2025-04-25 10:10:41
Java萌新修炼手册④:流程控制の三十六计——让代码学会"见风使舵"!
让天下没有难学的编程
29次阅读
2025-04-23 14:33:55
Java萌新修炼手册①:开局一把JDK,环境搭建全靠浪!
让天下没有难学的编程
23次阅读
2025-04-21 10:34:37
5.8 | Java 23:JavaDoc 重大升级,支持Markdown文档注释
严少安
22次阅读
2025-05-12 00:34:42
java浅拷贝BeanUtils.copyProperties引发的RPC异常
京东云开发者
19次阅读
2025-04-30 17:10:50
Java程序使用预处理语句的性能提升
GreatSQL社区
17次阅读
2025-04-23 11:18:50
解锁 Postgres 扩展日!与瀚高共探 C/Java 跨语言扩展技术的边界与未来
IvorySQL开源数据库社区
14次阅读
2025-05-08 10:04:53