【python】flask服务端响应与重定向处理

03-21 1770阅读

【python】flask服务端响应与重定向处理

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑

🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN新星创作者,掘金优秀博主,51CTO博客专家等。

🏆《博客》:Python全栈,前后端开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,linux,shell脚本等实操经验,网站搭建,面试宝典等分享。

所属的专栏:flask框架零基础,进阶应用实战教学

景天的主页:景天科技苑

文章目录

  • flask响应
    • 响应html文本
      • 1.返回字符串
      • 2.可以借助make_response()函数来返回Response对象
      • 3.通过Response返回Response对象
      • 返回JSON数据
        • 1.响应json数据[原生写法]
        • 2.返回json格式数据,返回各种json数据,包括列表,jsonify写法
        • 3.可能遇到的报错处理
        • 响应指定媒体类型文件
        • 重定向
          • 1.重定向到站外地址
          • 2.重定向到站内自己写的视图函数
          • 3.重定向到带有路径参数的视图函数

            flask响应

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

            数据响应: 默认响应html文本,也可以返回 JSON格式,或其他媒体类型文件

            页面响应: 重定向

            ​ url_for 视图之间的跳转

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

            响应html文本

            视图函数返回,即是响应结果

            1.返回字符串

            return  "123"
            

            【python】flask服务端响应与重定向处理

            postman请求,看下响应结果

            【python】flask服务端响应与重定向处理

            响应结果默认是html页面

            【python】flask服务端响应与重定向处理

            #如果类型不是response对象,则视图的返回值会被作为response对象的实例参数返回客户端

            #以元祖方式返回,第一个参数是html文本,第二个参数是响应状态码,第三个参数是响应头信息,字典方式传参

            return "

            hello

            ", 400, {"company": "python"}

            浏览器访问,查看响应内容,应状态码,响应头字段

            【python】flask服务端响应与重定向处理

            2.可以借助make_response()函数来返回Response对象

            需要导包 make_response

            from flask import Flask,make_response
            return make_response("

            hello

            ", 400, {"study": "flask"})

            【python】flask服务端响应与重定向处理

            浏览器访问

            【python】flask服务端响应与重定向处理

            3.通过Response返回Response对象

            需要导包

            from flask import Flask,Response
            

            我们看下源码Response参数

            【python】flask服务端响应与重定向处理

            【python】flask服务端响应与重定向处理

            浏览器访问,查看响应,状态码被修改,带上了响应头

            【python】flask服务端响应与重定向处理

            完整代码:

            from flask import Flask,make_response, Response
            app = Flask(__name__)
            app.config.update({
                "DEBUG": True
            })
            @app.route("/")
            def index():
                # 默认返回的就是HTML代码,在flask内部调用视图时,得到的返回值会被flask判断类型,
                #随意返回个字符串,默认响应结果是html页面
                # return  "123"
                # 如果类型不是response对象,则视图的返回值会被作为response对象的实例参数返回客户端
                #以元祖方式返回,第一个参数是html文本,第二个参数是响应状态码,第三个参数是响应头信息,字典方式传参
                # return "

            hello

            ", 400, {"company": "python"} #可以借助make_response()函数来返回Response对象 # return make_response("

            hello

            ", 400, {"study": "flask"}) # 通过Response返回Response对象 return Response(f"默认首页", 201, {"company": "python"}) if __name__ == '__main__': app.run(host="0.0.0.0", port=5000, debug=True)

            返回JSON数据

            1.响应json数据[原生写法]

            data = {"name": "小明", "age": 16}
            #一定要加上content-type响应头,否则响应的为html页面
            return json.dumps(data,ensure_ascii=False), 200, {"Content-Type": "application/json"}
            

            【python】flask服务端响应与重定向处理

            浏览器访问

            【python】flask服务端响应与重定向处理

            #也可以用Response返回json
            return Response(json.dumps(data), 200, {"Content-Type": "application/json"})
            

            【python】flask服务端响应与重定向处理

            【python】flask服务端响应与重定向处理

            2.返回json格式数据,返回各种json数据,包括列表,jsonify写法

            jsonify返回的是一个Response对象

            在 Flask 中可以直接使用 jsonify 生成一个 JSON 的响应

            需要导包

            from flask import Flask, jsonify
            data = [
                    {"id": 1, "username": "liulaoshi", "age": 18},
                    {"id": 2, "username": "liulaoshi", "age": 17},
                    {"id": 3, "username": "liulaoshi", "age": 16},
                    {"id": 4, "username": "小明", "age": Decimal(15)},
            ]
            return jsonify(data)
            

            【python】flask服务端响应与重定向处理

            浏览器访问,jsonify会自动将响应头content-type设为 application/json

            【python】flask服务端响应与重定向处理

            返回json完整代码

            from flask import Flask, jsonify, Response
            from decimal import Decimal
            import json
            app = Flask(__name__)
            # app.config.update({
            #     "JSONIFY_PRETTYPRINT_REGULAR": False,
            #     "SON_AS_ASCII":False
            # })
            @app.route("/")
            def index():
                # """返回json格式数据,返回json字典"""
                # data = {"name":"xiaoming","age":16}
                # return data
                """响应json数据[原生写法]"""
                # data = {"name": "小明", "age": 16}
                #一定要加上content-type响应头,否则响应的为html页面
                # return json.dumps(data,ensure_ascii=False), 200, {"Content-Type": "application/json"}
                #也可以用Response返回json
                # return Response(json.dumps(data), 200, {"Content-Type": "application/json"})
                """返回json格式数据,返回各种json数据,包括列表,jsonify写法"""
                data = [
                    {"id": 1, "username": "liulaoshi", "age": 18},
                    {"id": 2, "username": "liulaoshi", "age": 17},
                    {"id": 3, "username": "liulaoshi", "age": 16},
                    {"id": 4, "username": "小明", "age": Decimal(15)},
                ]
                return jsonify(data)
            if __name__ == '__main__':
                app.run(host="0.0.0.0", port=5000, debug=True)
            

            3.可能遇到的报错处理

            如果遇到报错 AttributeError: ‘Request’ object has no attribute ‘is_xhr’

            解决方法:

            将JSONIFY_PRETTYPRINT_REGULAR配置为False就能解决

            app = Flask(__name__)
            app.config.update({
                "JSONIFY_PRETTYPRINT_REGULAR": False,
            })
            

            如果遇到返回的中文编码不对

            解决方法:

            在flask配置文件配置:JSON_AS_ASCII = False # 支持中文

            app.config.update({
                "SON_AS_ASCII":False
            })
            

            综合对比,flask中返回json 数据,都是flask的jsonify方法返回就可以了,直接return只能返回字典格式的json数据。

            响应指定媒体类型文件

            响应图片给客户端

            先看下原图片

            【python】flask服务端响应与重定向处理

            视图函数

            @app.route("/img")
            def img():
                """响应图片格式给客户端"""
                with open("对称加密.png", "rb") as f:
                    data = f.read()
                return data, 200, {"Content-Type": "image/png"}  # MIME类型
            

            浏览器访问,能访问到图片数据

            【python】flask服务端响应与重定向处理

            不仅仅可以响应图片类型数据,视频音频,压缩包等等都可以

            只要知道该文件的MIME类型就可以

            常见的MIME类型网上一查一大堆

            【python】flask服务端响应与重定向处理

            重定向

            1.重定向到站外地址

            需要导包redirect

            from flask import Flask, redirect
            

            redirect参数

            【python】flask服务端响应与重定向处理

            视图函数:

            @app.route("/")
            def index():
                """页面跳转"""
                """
                301: 永久重定向,页面已经没有了,站点没有了,永久转移了。
                302:临时重定向,一般验证失败、访问需要权限的页面进行登录跳转时,都是属于临时跳转。
                """
                # redirect函数就是response对象的页面跳转的封装
                response = redirect("https://www.baidu.com", 302)
                return response
            

            redirect的原理,最终还是借助Resonse对象来实现:

            # redirect的原理,最终还是借助Resonse对象来实现:
            response = "", 302, {"Location": "https://www.baidu.com"}
            return response
            

            【python】flask服务端响应与重定向处理

            完整代码:

            from flask import Flask, redirect
            # 应用实例对象
            app = Flask(__name__)
            @app.route("/")
            def index():
                """页面跳转"""
                """
                301: 永久重定向,页面已经没有了,站点没有了,永久转移了。
                302:临时重定向,一般验证失败、访问需要权限的页面进行登录跳转时,都是属于临时跳转。
                """
                # redirect函数就是response对象的页面跳转的封装
                # response = redirect("https://www.baidu.com", 302)
                # redirect的原理,最终还是借助Resonse对象来实现:
                response = "", 302, {"Location": "https://www.baidu.com"}
                return response
            if __name__ == '__main__':
                # 启动项目的web应用程序
                app.run(host="0.0.0.0", port=5000, debug=True)
            

            2.重定向到站内自己写的视图函数

            可以直接填写自己 url 路径

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

            from flask import url_for
            

            我们判断在查询参数中是否有token,来决定是否需要跳转到登录页面

            from flask import Flask, redirect, Response,request
            from flask import url_for
            # 应用实例对象
            app = Flask(__name__)
            @app.route("/user")
            def index():
                if request.args.get("token"):
                    print('token',request.args.get("token"))
                    return "个人中心"
                # 跳转页面到登录视图中
                # redirect("url地址") # 控制页面跳转到任意路径下
                # return redirect("/login")
                # 跳转页面到其他视图中
                url = url_for("login")  # url_for("视图名称")
                print(app.url_map)  # 路由列表,整个flask站点中所有的url地址和视图的映射关系都在这个属性里面
                print(url)
                return redirect(url)
            @app.route("/login")
            def login():
                return "登录视图"
            if __name__ == '__main__':
                # 启动项目的web应用程序
                app.run(host="0.0.0.0", port=5000, debug=True)
            

            浏览器访问,第一次,我们查询参数不带token,页面跳转到了登录视图

            http://127.0.0.1:5000/user

            【python】flask服务端响应与重定向处理

            app.url_map 返回整个站点所有的url地址和视图的映射关系

            【python】flask服务端响应与重定向处理

            查询参数带上token,直接进入到个人中心

            http://127.0.0.1:5000/user?token=www

            【python】flask服务端响应与重定向处理

            3.重定向到带有路径参数的视图函数

            在 url_for 函数中传入参数

            from flask import Flask, redirect, url_for
            # 应用实例对象
            app = Flask(__name__)
            @app.route("/demo/")
            def mobile(mob):
                print(mob)
                return f"mobile={mob}"
            @app.route("/sms")
            def sms():
                """携带路径参数进行站内跳转"""
                # url_for("视图方法名", 路由路径参数名=路由参数值)
                url = url_for("mobile", mob=13312345678)
                print(url)
                return redirect(url)
            if __name__ == '__main__':
                # 启动项目的web应用程序
                app.run(host="0.0.0.0", port=5000, debug=True)
            

            在浏览器访问http://127.0.0.1:5000/sms,就会跳转到http://127.0.0.1:5000/demo/13312345678

            【python】flask服务端响应与重定向处理

            总结:

            综上就是flask服务端各种响应类型和重定向的各种用法,相当全面,感兴趣的朋友一键三连,falsk持续更新中!!!

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]