zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    滴滴打车如何成就150亿估值
    互联网专车高补贴开始“退烧”
    城市拥堵加剧,都是互联网快车惹的祸?
    滴滴打车动态加价10-20余元
    专车降价滴滴快车使命终结?
    “专车”监管意见最快本月公布
    专车新规或下周发布,估计有大量司机流失
    滴滴优步神州掀新一轮融资大战
    杭州或率先放开非公司化专车
    恭喜您!获得20元现金红包一个,赶快领取!
  • 原文地址:https://www.cnblogs.com/hszstudypy/p/12384860.html
Copyright © 2011-2022 走看看