本人有JavaWeb基础、Python基础
因Python使用爬虫,需要使用flask做前后端交互
【选择flask原因】

  1. 项目需要使用地图进行交互,无奈博主没有接触过Python+地图(开源有folium:学习曲线较抖)
  2. 使用的是Python爬虫,刚好与flask对接(flask5分钟即可入门,投入使用)

【flask】某种程度上说,flask=tomcat:创建一个HTTP接口,跨平台跨语言跨软件的可以使用这个HTTP接口,实现数据交换

使用前

【巨坑!】一定要设置
【后果】静态文件修改无用

  1. 清除浏览器缓存
  2. 关闭浏览器缓存

创建flask工程

  1. pycharm创建工程–>选创建flask工程
  2. 选择虚拟环境(pycharm会帮我们下载flask相关依赖库)
  3. pycharm帮我们创建了工程目录

设置url映射

# 这里url路径和函数名字要一样,博主设成不一样时,有报错
@app.route('/initparam', methods=['post'])
def initparam():
    pass

引用静态文件

  1. 将index.html文件放至templates
  2. 将js、css文件放至static
    [Flask] 10分钟使用Python做后台 | 零基础立刻上手flask
  3. Python中设置
app = Flask(__name__,
    static_url_path='' #【注意!】将static路径该为/,文件正常引用
)
@app.route('/')
def index():
    return render_template('index.html') #使用模板index.html
  1. 静态文件引用
<!-- 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'

异步处理后台任务

  1. 需要安装futures包
  2. 使用多线程(博主使用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

相关文章: