Flask学习之 请求与响应

一.Flask中的request请求

相关的学习文档: http://docs.jinkan.org/docs/flask/api.html#flask.request

requestflask中代表当前请求的 request 对象

作用:在视图函数中取出本次请求数据

导入:from flask import request

常用的属性如下:

1.获取args参数

获取get参数的数据,也就是url问号后的键值对数据

例:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = "hsz"
from  flask import Flask
from flask import request


app = Flask(__name__)

@app.route("/")
def index():
    # request
    print(request)
    """
    <Request 'http://127.0.0.1:9000/?name=zero&pwd=123' [GET]>
    """
# 1.获取get参数
# 获取查询字符串
    print(request.args)  # 获取查询字符串 也就是url问号后面的
    """
    访问路径:
    http://127.0.0.1:9000/?name=zero&pwd=123
    打印效果:
    ImmutableMultiDict([('name', 'zero'), ('pwd', '123')])
    MultiDict内部实现的是OrderDict字典结构
    from collections import OrderedDict   # 有序字典
    
    
    """
    """
    访问路径:
    http://127.0.0.1:9000/?name=zero&pwd=123&like=sing&like=running
    打印结果:
    zero
    """
    # 获取指定参数的值
    print(request.args.get('name'))  # 打印结果:zero
    """
    访问路径:
    http://127.0.0.1:9000/?name=zero&pwd=123&like=sing&like=running
    打印结果:
    ['sing', 'running']
    """
    # 获取指定参数的多个值,用于接收表单的多选框值  列表类型
    print(request.args.getlist('like'))  # 打印结果:['sing', 'running']
    return 'hello flask'


if __name__ == '__main__':
app.run(host='127.0.0.1',port=9000)
View Code

2.获取data请求体数据

也就是postman上提交body中的json数据

例:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = "hsz"
from flask import Flask
from flask import request
import json

app = Flask(__name__)


@app.route("/post", methods=['post'])
def get_post():
    """2.获取请求体请求数据"""
    print(request.data)
    data = json.loads(request.data)
    print(data)  # 结果: {'username': 'xiaoming', 'pwd': '123456'}  在flask版本较低中使用
    """
    访问地址:http://0.0.0.0:9000/post
    接收效果:b'{
	"username":"xiaoming",
	"pwd":"123456"
}'
    """
    """ 直接获取json数据"""
    print(request.json)  # 0.10版本以下没有
    """
    参数:JSON
    {
        'username': 'xiaoming', 
        'pwd': '123456'
    }
    """
    return "post ok"


if __name__ == '__main__':
app.run(host='127.0.0.1', port=9000)
View Code

3.获取form表单数据

例:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = "hsz"
from flask import Flask
from flask import request
from werkzeug.utils import secure_filename
import os

app = Flask(__name__)


@app.route("/file", methods=['post'])
def form():
    UPLOAD_FOLDER = 'static\uploads'  # 文件下载路径   win10
    # UPLOAD_FOLDER = 'static/Uploads'  # 文件下载路径  linux
    ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'jpg'])  # 文件允许上传格式
    """接收上传文件"""
    print(request.files)
    """
    postman上传类型:form-data
    一个文件和一个user:zero
    打印:
    ImmutableMultiDict([('user', 'zero')])
    ImmutableMultiDict([('notes', <FileStorage: '笔记.txt' ('text/plain')>)])
    FileStorage是一个对象
    """
    print(request.files.get('notes'))
    """
    可以调用FileStorage里面的save方法进行文件上传的保存到指定的地址
    """
    # 获取当前项目的目录
    # 也就是当前文科的目录
    print(os.path.abspath(os.path.dirname(__file__)))
    current_path = os.path.abspath(os.path.dirname(__file__))
    files = request.files.get('notes')
    if files and ALLOWED_EXTENSIONS:
        from unicodedata import normalize
        filename = secure_filename(normalize('NFKD', files.filename).encode('utf-8', 'ignore').decode('utf-8'))
        # 使用secure_filename()让文件名变得安全
        # Libsite-packageswerkzeugutils.py
        # 这边需要注意中文文件名上传无法获取中文文件名问题
        print(filename)
        # filename = filename.encode('utf-8', 'strict').decode('utf-8')
        print(filename)
        path = os.path.join(current_path, UPLOAD_FOLDER, filename)  # 路径拼接
        print(path)
        files.save(path)

    return "file uploads ok"


if __name__ == '__main__':
    app.run(host='127.0.0.1', port=9000)
View Code

4.获取method方法

例:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = "hsz"

from flask import Flask
from flask import request

app = Flask(__name__)


# methods=['get', 'post', 'put', 'delete'] 表示允许访问的方法
@app.route('/method', methods=['get', 'post', 'put', 'delete'])
def index():
    # 打印请求方法
    print(request.method)
    """
    get 的时候打印:
    GET
    
    post的时候:
    POST
    
    put的时候:
    PUT
    
    delete的时候:
    DELETE
    """
    return 'method ok'


if __name__ == '__main__':
    app.run(host='127.0.0.1', port=9000)
View Code

5.获取headers请求头数据

例:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = "hsz"

from flask import Flask
from flask import request

app = Flask(__name__)


@app.route('/headers', methods=['get', 'post'])
def headers():
    # 获取请求头的数据
    print(request.headers)
    """
    访问链接:
    http://127.0.0.1:9000/headers
    
    打印内容:
    Content-Type: application/x-www-form-urlencoded
    User-Agent: PostmanRuntime/7.21.0
    Accept: */*
    Cache-Control: no-cache
    Postman-Token: 869ac15a-2648-4042-bb7a-9463666e9208
    Host: 127.0.0.1:9000
    Accept-Encoding: gzip, deflate
    Content-Length: 43
    Connection: keep-alive
    """
    #
    print(request.headers.get('Content-Type'))
    """
    打印内容:
    application/x-www-form-urlencoded
    """

    # 例2:获取自定义的请求头信息
    print(request.headers.get('Cpwd'))
    """
    参数:在Headers上加键值对:  Cpwd     ewqoeuqieq1231313
    打印内容:
    ewqoeuqieq1231313
    """
    return 'header ok'


if __name__ == '__main__':
app.run(host='127.0.0.1', port=9000)
View Code

二.Flask中的响应

flask默认支持2种响应方式:

数据响应: 默认响应html文本,也可以返回 JSON格式

页面响应: 重定向

url_for  # 站内不同视图的函数跳转

响应的时候,flask也支持自定义http响应状态码

1.返回页面响应

例:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = "hsz"

from flask import Flask, render_template
from flask import make_response

# 调用了 render_template模板
# 将templates的目录创建在这个应用的同级目录下

app = Flask(__name__)


@app.route('/response')
def my_response():
    response = make_response('<h1>This document carries a cookie!</h1>')
    response.set_cookie('answer', '42')
    # return '<h1>This document carries a cookie!</h1>'  # 效果一样
    return response


# 在templates目录下创建网页
@app.route('/')
def index():
    return render_template('index.html')


@app.route('/user/<name>/')
def user(name):
    return render_template('user.html', name=name)


# 自定义404错误页面 在templates目录下创建网页
# 输入错误的url返回404页面
@app.errorhandler(404)
def page_not_found(error):
    return render_template('404.html'), 404


# 自定义500 错误页面 在templates目录下创建网页
@app.errorhandler(500)
def page_not_found(DatabaseError):
    return render_template('500.html'), 500


if __name__ == '__main__':
    app.run(host='127.0.0.1', port=5000)
View Code

2.返回JSON数据

例:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = "hsz"

from flask import Flask, jsonify

app = Flask(__name__)


@app.route("/json")
def json():
    # 也可以响应json格式代码
    data = [
        {"id": 1, "username": "liulaoshi", "age": 18},
        {"id": 2, "username": "liulaoshi", "age": 17},
        {"id": 3, "username": "liulaoshi", "age": 16},
        {"id": 4, "username": "liulaoshi", "age": 15},
    ]
    # 返回前端json数据
    return jsonify(data)


if __name__ == '__main__':
    app.run(port=5000, host='127.0.0.1', debug=True)
View Code

返回结果如下:

3.返回重定向redirect

例:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = "hsz"

from flask import Flask
from flask import redirect

app = Flask(__name__)


# 页面跳转响应
@app.route("/user")
def user():
    # 页面跳转 redirect函数就是response对象的页面跳转的封装
    # Location: http://www.baidu.com
    return redirect("http://www.baidu.com")


@app.route("/red")
def red():
    """站内跳转"""
    return redirect("/user")
    # 使用 http://0.0.0.0:5000/red 测试会调到/user再重定向到百度


if __name__ == '__main__':
    app.run(port=5000, host='127.0.0.1', debug=True)
View Code

4.重定向到自己写的视图函数url_for

可以直接填写自己 url 路径

也可以使用 url_for 生成指定视图函数所对应的 url

例:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = "hsz"

from flask import Flask, jsonify
from flask import redirect, url_for

app = Flask(__name__)


@app.route("/my_json")
def json():
    # 也可以响应json格式代码
    data = [
        {"id": 1, "username": "liulaoshi", "age": 18},
        {"id": 2, "username": "liulaoshi", "age": 17},
        {"id": 3, "username": "liulaoshi", "age": 16},
        {"id": 4, "username": "liulaoshi", "age": 15},
    ]
    # 返回前端json数据
    return jsonify(data)


@app.route("/red")
def red():
"""站内跳转
会跳转到json函数中去
和json函数上的url变化无关,不管上面怎么变化始终都能跳转到json视图函数
"""
    return redirect(url_for("json"))
# 使用 http://0.0.0.0:5000/red 测试会重定想到上面的json方法 得到json数据



if __name__ == '__main__':
    app.run(port=5000, host='127.0.0.1', debug=True)

5.自定义状态码或自定义响应头(开发中常见)

Flask 中,可以很方便的返回自定义状态码,以实现不符合 http 协议的状态码,例如:

"""还可以使用make_response创建Response对象,然后通过response对象返回数据"""
from flask import make_response


@app.route("/rep")
def rep():
    response = make_response("ok")
    print(response)
    # 自定义响应头
    response.headers["author"] = "huang"  # 自定义响应头信息
    # 自定义响应状态码
return response, 222     # 返回自定义状态码222

原文地址:https://www.cnblogs.com/hszstudypy/p/12384860.html