Flask-请求和响应

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的类型是一致的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NeilNiu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值