1、Get请求
request.args
类型是 不可变字典,可以选择to_dict() 转化成普通的可变字典
2、Post请求
request.form
3、Json数据
request.json
通过ajax发送post请求
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<title>Title</title>
</head>
<body>
<form action="/uploads" method="post" enctype="multipart/form-data">
<input type="file" name="pic">
<input type="submit">
</form>
<button onclick="send_ajax()">点击发送</button>
<script>
function send_ajax() {
$.ajax({
url:'http://127.0.0.1:5000/send',
data:JSON.stringify({username:"tudou"}),
dataType:'json',
type:'POST',
contentType:'application/json',
success:function(data){
alert('成功')
}
})
}
</script>
</body>
</html>
python
from flask import Flask, request, render_template
app = Flask(__name__)
@app.route('/send', methods=['GET', 'POST'])
def send():
if request.method == 'GET':
return render_template('index.html')
elif request.method == 'POST':
a = request
print(request.json)
print(request.form)
print(request.content_type)
print(request.environ)
return "成功"
if __name__ == '__main__':
app.run(debug=True)
上传图片:
上传文件格式,单独写方法校验后缀,上传图片大小,Flask自带限制方法,在app.config里设置。Flask有现成的一个第三方插件可以解决上传
from flask import Flask, request, render_template
app = Flask(__name__)
# 限制上传文件的大小
app.config['MAX_CONTENT_LENGTH'] = 1024 * 1024
@app.route('/send', methods=['GET', 'POST'])
def send():
if request.method == 'GET':
return render_template('index.html')
elif request.method == 'POST':
a = request
print(request.json)
print(request.form)
print(request.content_type)
print(request.environ)
return "成功"
def allow_format(filename):
file_list = ['jpg', 'png']
format_file = filename.split('.')[1]
if format_file in file_list:
return True
return False
@app.route('/upload', methods=['GET', 'POST'])
def upload():
a = request
file = request.files.get('photo')
if file is None:
return render_template('index.html')
# 限制文件的类型
if allow_format(file.filename):
file.save(secure_filename(file.filename))
return 'save success'
return 'error'
if __name__ == '__main__':
app.run(debug=True)
Flask读取图片,第一个入参是路径,第二个入参是文件名
http://127.0.0.1:5000/upload/360wallpaper.jpg
@app.route('/upload/<filename>')
def get_upload(filename):
return send_from_directory(os.getcwd(), filename)
响应json格式
三种写法
1、json.dumps({"username": "test"}), {"context-type": "applicatin/json"}
2、r = make_response({"username":"test"}, {"context-type": "application/json"})
3、return r
r = jsonify({"username": "test"})
import json
from flask import Flask, make_response, jsonify
app = Flask('__name__')
@app.route('/')
def index():
# return json.dumps({"username": "test"}), {"context-type": "applicatin/json"}
# r = make_response({"username":"test"}, {"context-type": "application/json"})
# return r
r = jsonify({"username": "test"})
return r
if __name__ == '__main__':
app.run(debug=True)
重定向
使用redirect(url_for('login', project_id='3')),定义多个参数的时候就往后写
重定向到login上的时候后面会自动带上这个project_id=3这个参数
from flask import Flask, request, url_for
from werkzeug.utils import redirect
app = Flask('__name__')
@app.route('/')
def index():
if request.args.get('username') is None:
return redirect(url_for('login', project_id='3', username='test'))
return 'hello'
@app.route('/login')
def login():
return 'login'
if __name__ == '__main__':
app.run(debug=True)
错误响应,对不可预知的错误,定义一个全局的错误处理,debug=True,显示错误信息,改成False后,显示的是500 服务不可用,用errorhandler做为装饰器,拦截所有错误,# 定义一个全局的错误处理
from flask import Flask, request, url_for, render_template
from werkzeug.utils import redirect
app = Flask('__name__')
@app.route('/error')
def error():
1/0
return 'error'
# 定义一个全局的错误处理
@app.errorhandler(500)
def server_error(error):
return render_template('error_500.html')
if __name__ == '__main__':
app.run(debug=False)
对于一个可以预知的错误,有一个规则是一个函数一般有一个return,然后可以用raise ,但是一般还是用return,但是要确保,return的类型是一致的