2018-07-04

Flask的使用

Flask是一个Python Web框架。与Django相比,Flask更为轻量化。(Flask 0.10.1 文档)

Hello World

from flask import Flask

app = Flask(__name__)

@app.route('/')

def hello_world():

    return 'Hello World!'

if __name__ == '__main__':

    app.run()

设置访问地址和端口。PS:host='0.0.0.0',才能通过本机IP访问,否则只能通过设置的ip访问。

app.run(host='0.0.0.0', port=80,)

Jinja2

Jinja2是基于python的模板引擎。

在Flask中使用Jinja2:

return render_template('simple.html', balance=balance, treded_list=traded_list)

其中第一个参数simple.html就是模版文件,放在templates目录下。后面的参数,是要传给Jinja2去渲染的入参。

模版渲染数据

将入参对象balance的acc_number属性装载到td标签中。simple.html:

账户:

{{balance.acc_number}}

大致效果如下:

账户:009102999099004

金额格式化

将数字转换为金额的格式。simple.html:

可用余额(元):

{{"{:,}".format(balance.acc_balance)}}

结果:30,120.00

循环

讲流水列表循环显示出来:

{% for acc in acc_list %}

    {{acc.acc_name}}({{acc.acc_number}})

{% endfor %}

循环入参对象acc_list,将账户信息添加到下拉框的选项中。

三元运算

语法:value1 if expression else value2,如果expression是真,则返回value1,否则返回value2

{{acc.project_name if acc.project_name is not none else acc.acc_name}}

更多Jinja2的相关知识: Flask系列教程(3)——Jinja2模版、模板jinja2常用方法

下载文件

参考:Flask下载文件

下载目录中的文件

这种情况比较简单, flask里带有此类api, 可以用send_from_directory和send_file.

代码示例:

from flask import send_file, send_from_directoryimport [email protected]("/download/", methods=['GET'])

def download_file(filename):

    # 需要知道2个参数, 第1个参数是本地目录的path, 第2个参数是文件名(带扩展名)

    directory = os.getcwd()  # 假设在当前目录

    # 下载 directory 目录下的 filename

    return send_from_directory(directory, filename, as_attachment=True)

PS:send_from_directory有文件名中文编码错误的问题,所以如果需要下载文件名带中文的文件,就不能用该方法。

接口返回文件数据流

如果文件是通过爬虫下载,并且不需要存到服务器,也就是以数据流的方式拿到文件的情况。那么可以通过make_response来将文件数据流返回的客户端。

代码示例:

import [email protected]('/fileManager/download///', methods=['GET'])

def download_file(projId, id, filename):

    try:

        url = "your url"

        r = requests.get(url, timeout=500)

        if r.status_code != 200:

            raise Exception("Cannot connect with oss server or file is not existed")

        response = make_response(r.content)

        mime_type = mimetypes.guess_type(filename)[0]

        response.headers['Content-Type'] = mime_type

        response.headers['Content-Disposition'] = 'attachment; filename={}'.format(filename.encode().decode('latin-1'))

        return response

    except Exception as err:

        print('download_file error: {}'.format(str(err)))

        logging.exception(err)

        return Utils.beop_response_error(msg='Download oss files failed!')

项目结构说明

目录结构:

|-web

    |-static

        |-jquery-3.3.1.min.js

        |-search_tag.js

        |-search_tag.css

        |-...

    |-templates

        |-simple.html

        |-config.html

        |-...

    |-simple_app.py

    |-...

static:是资源文件(js、css等)所在目录,所有的资源文件必须放在这个目录下。

templates:是模版文件所在目录,也就是render_template的根目录。所有的模版文件都必须放在该目录下。 所以,基于以上目录结构,

return render_template('templates/simple.html')

是错误的,正确的写法是:

return render_template('simple.html')

simple_app.py:Flask主程序。

你可能感兴趣的:(2018-07-04)