本人有JavaWeb基础、Python基础
因Python使用爬虫,需要使用flask做前后端交互
【选择flask原因】
- 项目需要使用地图进行交互,无奈博主没有接触过Python+地图(开源有folium:学习曲线较抖)
- 使用的是Python爬虫,刚好与flask对接(flask5分钟即可入门,投入使用)
【flask】某种程度上说,flask=tomcat:创建一个HTTP接口,跨平台跨语言跨软件的可以使用这个HTTP接口,实现数据交换
使用前
【巨坑!】一定要设置
【后果】静态文件修改无用
- 清除浏览器缓存
- 关闭浏览器缓存
创建flask工程
- pycharm创建工程–>选创建flask工程
- 选择虚拟环境(pycharm会帮我们下载flask相关依赖库)
- pycharm帮我们创建了工程目录
设置url映射
# 这里url路径和函数名字要一样,博主设成不一样时,有报错
@app.route('/initparam', methods=['post'])
def initparam():
pass
引用静态文件
- 将index.html文件放至templates
- 将js、css文件放至static
- Python中设置
app = Flask(__name__,
static_url_path='' #【注意!】将static路径该为/,文件正常引用
)
@app.route('/')
def index():
return render_template('index.html') #使用模板index.html
- 静态文件引用
<!-- Leaflet -->
<link href="/js/leaflet/leaflet.css" type="text/css" rel="stylesheet"/>
<script src="/js/leaflet/leaflet.js"></script>
<script src="/js/leaflet/plugins/leaflet.ChineseTmsProviders.js"></script>
<!-- boostrap -->
<link href="/js/bootstrap-3.3.7-dist/css/bootstrap.min.css" rel="stylesheet">
<script src="/js/jquery-3.3.1.js"></script>
<script src="/js/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
表单form
【HTML】写法
// 这里使用了python的url_for()函数,他可以帮我们自动拼接到@app.route('/initparam')的url
<form id='formid' action="{{ url_for('initparam') }}" method="post">
<button id="rectangleSel" type="button" class="btn btn-default">选取范围</button>
<!--<input id="centerPoint" name="centerPoint" class="form-control loc" type="text" placeholder="还未选择范围。" readOnly="true">-->
<!--【ERROR!】 有属性disable,这一行的数据不会被form提交到后端!disable属性会使input无效、也不能被选择!(如果这要不能被修改,使用readOnly,如下)-->
<input id="centerPoint" name="centerPoint" class="form-control loc" type="text" placeholder="还未选择范围。" readOnly="true">
</form>
【flask】
import request # 读form里的参数
@app.route('/initparam',
methods=['post'] # 设置methods,表单提交一定要填post
)
def initparam():
params['center_point'] = request.form.get("centerPoint", #form中name的值
type=str #类型
)
return 'I get it'
异步处理后台任务
- 需要安装futures包
- 使用多线程(博主使用thread会出错,还未找到原因)
from concurrent.futures import ThreadPoolExecutor #导入包
executor = ThreadPoolExecutor(1) #线程
@app.route('/initparam', methods=['post'])
def initparam():
params['center_point'] = request.form.get("centerPoint", #form中name的值
type=str #类型
)
# 开启任务,异步进程
executor.submit(start(params) ) #异步开启start()函数
return '已经得到参数,后台正在进行任务'
def start(params ):
print "后台正在处理大任务!"
pass