· 7 years ago · Oct 06, 2018, 05:42 PM
1"""
2Flask + Flask-WTF file uploading and processing example.
3
4Requires:
5- flask
6- flask-wtf
7"""
8
9import os
10import shutil
11from flask import Flask, redirect, url_for, render_template_string
12from flask_wtf import FlaskForm
13from flask_wtf.file import FileField, FileRequired
14from wtforms import SubmitField, StringField
15from wtforms.validators import DataRequired
16
17app = Flask(__name__)
18basedir = os.path.abspath(os.path.dirname(__file__))
19filedir = os.path.abspath(os.path.join(basedir, './files/'))
20tmpfiledir = os.path.abspath(os.path.join(basedir, './tmp/'))
21
22
23if not os.path.exists(filedir):
24 os.mkdir(filedir)
25
26if not os.path.exists(tmpfiledir):
27 os.mkdir(tmpfiledir)
28
29
30first_page = """
31<!DOCTYPE html>
32<body>
33 <h1>First Page</h1>
34 <form action="" method="post" enctype="multipart/form-data">
35 {{ form.hidden_tag() }}
36 <p>
37 {{ form.file.label }} {{ form.file(size=32) }}
38 </p>
39 <p>
40 {{ form.submit() }}
41 </p>
42 </form>
43</body>
44</html>
45"""
46
47second_page = """
48<!DOCTYPE html>
49<html lang="en">
50<head>
51</head>
52<body>
53 <h1>Second Page</h1>
54 <p>File: {{ file }}</p>
55 <form action="" method="post" novalidate>
56 {{ form.hidden_tag() }}
57 <p>
58 {{ form.text.label }} {{ form.text(size=32) }}
59 </p>
60 <p>
61 {{ form.submit() }}
62 </p>
63 </form>
64</body>
65</html>
66"""
67
68
69class Config(object):
70 SECRET_KEY = 'abcdefg'
71
72
73app.config.from_object(Config)
74
75
76class FirstForm(FlaskForm):
77 file = FileField('File', validators=[FileRequired()])
78 submit = SubmitField('Submit')
79
80
81class SecondForm(FlaskForm):
82 text = StringField('Text', validators=[DataRequired()])
83 submit = SubmitField('Submit')
84
85
86@app.route('/', methods=['GET', 'POST'])
87def first_route():
88 form = FirstForm()
89 if form.validate_on_submit():
90 print('test')
91 file_name = './somefile.pdf'
92 form.file.data.save(os.path.join(tmpfiledir, file_name))
93 return redirect(url_for('second_route', file=file_name))
94 return render_template_string(first_page, form=form)
95
96
97@app.route('/second/<file>', methods=['GET', 'POST'])
98def second_route(file):
99 form = SecondForm()
100 if form.validate_on_submit():
101 file_name = form.text.data
102 shutil.copyfile(os.path.join(tmpfiledir, file),
103 os.path.join(filedir, file_name))
104 return redirect(url_for('first_route'))
105 return render_template_string(second_page, form=form)
106
107
108if __name__ == '__main__':
109 app.run()