一、框架结构
│ ├── flask // 源码目录
│ ├── templates // 模板
│ │ ├── index.html // 首页
│ │ ├── extraction.html // 提取页面
│ ├── app.py // 应用
│ ├── extraction .py // 处理过程
1、app.py
from flask import Flask, render_template
import os
from extraction import Submit, GetData
app = Flask(__name__)
SECRET_KEY = os.urandom(32)
app.config['SECRET_KEY'] = SECRET_KEY
"""
方案2
from flask import Flask
from flask import current_app
from flask_restful import Api, Resource, reqparse
api = Api(app)
"""
@app.route('/')
def index():
# 首页
current_app.logger.info("index")
return render_template('index.html')
@app.route('/extraction/', methods=['GET', 'POST'])
def extraction():
# 提取页面
form = Submit()
if form.validate_on_submit():
return GetData()
return render_template('extraction.html', form=form)
@app.route('/test', methods=['GET', "POST"])
def test():
# POST方式获取参数
res = request.form.get('name')
res = request.form
res = request.values
res = request.data # 请求时需是json类型 在Headers中设置 Content-Type:application/json
res = request.json # 请求时需是json类型
res = request.get_data() # 请求时需是json类型
# GET方式获取参数
res = request.args.get('name')
res = request.args
res = request.values
"""
class flaskapi(Resource):
def get():
# 首页
current_app.logger.info("index")
return render_template('index.html')
def post():
form = Submit()
if form.validate_on_submit():
return GetData()()
return render_template('extraction.html', form=form)
api.add_resource(flaskapi, "/flaskapi")
""""
if __name__ == "__main__":
app.run(host="127.0.0.1", port=5050)
2.index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
这是首页
<hr />
{% block body %}
<a class="extraction" href="/extraction/"> 数据提取演示 </a>
{% endblock %}
</body>
</html>
3. extraction.html
{% extends "index.html" %}
{% block body %}
<form action="" method="post" novalidate>
{{ form.hidden_tag() }}
<p>{{ form.submit() }}</p>
</form>
{% endblock %}
4、extraction.py
from flask_wtf import FlaskForm
import pandas as pd
import io
from flask import make_response
from wtforms import SubmitField
import time
class GetData:
def __init__(self):
self.data = pd.DataFrame(['Geeks', 'is', 'portal'])
def __call__(self):
df = self.data
out = io.BytesIO()
writer = pd.ExcelWriter(out, engine='xlsxwriter')
df.to_excel(excel_writer=writer, index=False, sheet_name='示例')
writer.save()
writer.close()
file_name = time.strftime('%Y%m%d', time.localtime(time.time())) + '.xlsx'
response = make_response(out.getvalue())
response.headers["Content-Disposition"] = "attachment; filename=%s" % file_name
response.headers["Content-type"] = "application/x-xls"
""" 如果输出的是 csv 文件
df = self.data
out = io.StringIO()
df.to_csv(out, index=False)
file_name = time.strftime('%Y%m%d', time.localtime(time.time())) + '.csv'
response = make_response(out.getvalue())
response.headers["Content-Disposition"] = "attachment; filename=%s" %file_name
response.headers["Content-type"] = "text/csv"
"""
return response
class Submit(FlaskForm):
submit = SubmitField('提取数据')
二、关键过程
df = getdata()
out = io.StringIO()
df.to_csv(out, index=False)
file_name = time.strftime('%Y%m%d', time.localtime(time.time())) + '.csv'
response = make_response(out.getvalue())
response.headers["Content-Disposition"] = "attachment; filename=%s" %file_name
response.headers["Content-type"] = "text/csv"
三、获取当前路径
import os
path = os.path
path1 = os.getcwd() # 获取当前工作目录路径
path2 =os.path.abspath('.') # 获取当前工作目录路径
path3 = os.path.abspath(os.curdir) # 获取当前工作目录路径