软硬件环境
- Windows 10 64bit
- Anaconda3 with python 3.7
- PyCharm 2019.3
- Flask 1.1.1
文件上传
简介
文件上传是个经常碰到的问题。其中涉及很多的内容比如文件的上传、文件类型的过滤,文件大小的限制,文件重命名,文件目录管理等等。下面我们来看看最基本的上传功能
的实现,至于提到的其它问题,大家可以自己摸索摸索。
Flask处理文件上传
在Flask
中进行文件上传,需要在通过html
中的form
表单,而且需要设置enctype=multipart/form-data
,看下面的实例
index.html
文件内容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>upload</title>
</head>
<body>
<form action = "/success" method = "post" enctype="multipart/form-data">
<input type="file" name="file">
<input type = "submit" value="Upload">
</form>
</body>
</html>
复制代码
主要就是一个form
表单,使用的http
方法是POST
并且设置enctype="multipart/form-data"
,input
标签的类型是file
,接下来还需要编写一个html
,用来显示上传成功后的信息
success.html
文件内容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Success</title>
</head>
<body>
<p>File uploaded successfully!</p>
<p>File Name: <b> {{name}} </b></p>
</body>
</html>
复制代码
最后来看看Flask
端的处理代码,run.py
文件内容
from flask import Flask, render_template, request
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/success', methods=['POST'])
def success():
if request.method == 'POST':
f = request.files['file']
f.save(f.filename)
return render_template('success.html', name=f.filename)
if __name__ == '__main__':
app.run(host="127.0.0.1",port=5000,debug=True)
复制代码
注意到success
方法中,只处理POST
请求,并从请求对象中的files
获取到文件的内容,调用save
保存文件,渲染网页时,将文件名传递过去,文件名会在success.html
中显示
启动Flask
服务,访问http://127.0.0.1:5000
点击选择文件
,在弹出框中选择需要上传的文件,然后点击Upload
来到pycharm
可以看到刚刚接收到的文件python_logo.png
重定向
简介
我们知道,每一次客户端向服务器发送http
请求,服务器都会返回一个http
状态码,如200就表示请求成功,404就表示访问的资源不存在。针对不同的http
状态码,返回的http
主体内容也不一样。
Flask重定向
在Flask
中,Flask
对象提供了redirect
方法来实现重定向。redirect
方法的语法如下
Flask.redirect(<location>,<status-code>, <response> )
复制代码
其中
- location: 重定向的
url
- status-code:
http
头部的状态码 - response: 响应实体
在实际场景中,redirect
一般结合url_for
来使用,而url_for
会根据视图函数名称得到当前所指向的url
来看个实例
login.html
文件内容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
<form method = "post" action = "http://localhost:5000/validate">
<table>
<tr>
<td>Email</td>
<td><input type = 'email' name = 'email'></td>
</tr>
<tr>
<td>Password</td>
<td><input type = 'password' name = 'password'></td>
</tr>
<tr>
<td><input type = "submit" value = "Submit"></td>
</tr>
</table>
</form>
</body>
</html>
复制代码
这是一个简单的登录界面,需要输入email
和password
来进行登录
run.py
文件内容
from flask import Flask, render_template, request, redirect, url_for
app = Flask(__name__)
@app.route('/login')
def login():
return render_template('login.html')
@app.route('/validate', methods=['POST'])
def validate():
if request.method == 'POST' and request.form['email'] == 'test@gmail.com' and request.form['password'] == 'test':
return redirect(url_for('success'))
return redirect(url_for('login'))
@app.route('/success')
def success():
return 'Logged in successfully.'
if __name__ == '__main__':
app.run(host="127.0.0.1",port=5000,debug=True)
复制代码
主要看看服务器端对用户登录是的验证部分validate
,当满足一定条件时,我们跳转到success
视图函数所指定的url
,否则,回到登录界面
启动Flask
服务,访问http://127.0.0.1:5000/login
我们填入email
为test@gmail.com
,password
为test
如果email
或password
有一项错误的话,页面回到登录界面