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主程序。