美文网首页Web开发——Flask框架
Flask框架——response响应对象及request对象

Flask框架——response响应对象及request对象

作者: 白巧克力LIN | 来源:发表于2021-11-19 16:52 被阅读0次

    在上篇文章中我们学习了Flask框架——路由(Route)、环境配置,这篇文章学习Flask框架——response响应及request请求。

    在学习之前,我们简单地了解一下客户端和服务端的请求与响应过程,如下图所示:



    很简单,客户端需要访问某个服务器的网站,首先发送Request请求(请求头、请求体和请求行),当服务端接收到我们的Request请求后,就会根据请求的内容来返回Response对象(响应行、响应头、响应体),其中响应体是我们网页显示的内容。

    简单了解了请求与响应后,我们开始学习response响应及request请求。

    Response响应

    可以说响应对象其实是在路由中视图函数返回的值,其中视图函数返回值可以为元组、字符串、字典、对象,

    示例代码如下所示:

    from flask import Flask, Response, make_response
    
    app=Flask(__name__)
    
    # 元组
    @app.route('/tuple')
    def index1():
        return ('元组',200)
    
    # 字典
    @app.route('/dict')
    def index2():
        return {'a':'北京','b':'上海','c':'广州'}
    
    # 字符串
    @app.route('/str')
    def index3():
        return "字符串"
    
    # 对象
    @app.route('/object')
    def index4():
        return Response('对象')   #使用Response()方法获取对象
    
    if __name__ == '__main__':
        app.run(port=8080,debug=True)
    

    运行Flask程序后,分别访问以下URL链接:

    http://127.0.0.1:8080/tuple
    http://127.0.0.1:8080/dict
    http://127.0.0.1:8080/str
    http://127.0.0.1:8080/object
    

    网页显示的内容分别为:

    元组
    {
      "a": "\u5317\u4eac", 
      "b": "\u4e0a\u6d77", 
      "c": "\u5e7f\u5dde"
    }
    字符串
    对象
    

    return后面返回字符串其实是做了一个response对象的封装。

    注意:返回值为元组数据时,不能以以下形式返回:

    return ('a','b','c')
    

    必须要以下面的形式返回:

    # return '内容',响应码
    return '11111',200
    

    打开开发者工具,观察Response Headers内容如下图所示:



    这里我们是选取了字典的Response Headers,在Response Headers展示了响应码、媒体类型、字符长度、服务名、访问时间的信息。当返回值为字符串、元组、对象时,媒体类型为text/html的响应对象;

    那么我们想在Response Headers响应头中定值属于自己的内容怎么办呢?

    这时可以使用make_response()方法获取响应对象,定制请求头,示例代码如下所示:

    @app.route('/make_response')
    def index5():                       
        response=make_response('make_response')     #获取响应对象
        response.headers['aaaa']='aaaa'             #定值名为aaaa,值为aaaa的响应头内容
        return response
    

    这样我们就成功定制了属于自己的响应头,运行结果如下图所示:



    当我们返回内容是一个完整的HTML文件,该如何返回呢?

    当我们返回内容是一个完整的HTML网页时,该怎么办呢?这时我们可以通过render_template()方法就可以渲染完整的HTML文件为字符类型,其语法格式如下:

    render_template('html文件')
    

    准备一个html文件,然后编写以下代码:

    from flask import Flask, render_template
    app=Flask(__name__)
    @app.route('/register')
    def register2():
        r=render_template('register.html')
        return r
    if __name__ == '__main__':
        app.run(port=8080,debug=True)
    

    运行程序后,访问以下URL链接:

    http://127.0.0.1:8080/register
    

    网页返回结果如下图所示:


    这样就成功把HTML文件呈现在网页上了,注意:由于render_template()默认是从templates文件夹中获取HTML文件,所以我们一般都是把HTML文件放在templates中,如下图所示:


    当然我们也可以创建一个字符串变量,并把HTML文件内容写在字符串变量中,代码如下:

    @app.route('/register')
    def register():
        s='''
        html文件代码
        '''
        return s
    

    当我们HTML代码很长时,写在路由函数就会很长,很麻烦,所以我们一般不会把HTML写在路由函数中。

    request请求

    我们学习了response响应对象,那么如何发送request请求呢?首先我们创建一个名为register.html文件,代码如下所示:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <div>
        <form action="/get_data" method="get">
            <p><input type="text" name="username" placeholder="请输入用户名"></p>
            <p><input type="text" name="address" placeholder="请输入地址"></p>
            <p><input type="submit" value="提交"></p>
        </form>
    </div>
    </body>
    </html>
    

    我们利用了form标签的action属性,当点击提交时,网页将跳转到get_data网页中,并设置了method值为get,表示提交后发送请求为get请求。

    其register.html网页展示内容如下图所示:


    Flask示例代码如下所示:

    from flask import Flask, render_template
    
    app=Flask(__name__)
    
    @app.route('/register')
    def register():
        return render_template('register.html')         #渲染register.html文件
    
    @app.route('/get_data')
    def get_data():        
        return '提交成功'           
    if __name__ == '__main__':
        app.run(port=8080,debug=True)
    

    首先我们创建@app.route('/register')路由并将register视图函数来绑定URL:register,,该视图函数作用为渲染register.html文件返回给,再创建@app.route('/get_data')路由并将视图函数绑定在URL(/get_data)中,运行程序并打开http://127.0.0.1:8080/register,如下图所示:


    这里我们输入了小明、北京这两个数据,然后点击提交,如下图所示:

    可以发现,请求方法是get,跳转的URL为:
    http://127.0.0.1:8080/get_data?username=小明&address=北京
    

    那么为什么是这个URL呢,首先我们在HTML设置了action属性,当点击提交时,就会跳转到http://127.0.0.1:8080/get_data页面中,通过问号将表单的值拼接起来,其中username、address分别为HTML文件中input标签的name值。

    那么发送post请求是不是只要将HTML文件中,form中的method的值改为post就可以了呢?

    答案是:不是。

    首先我们通过url_map()方法查看路由表,代码如下图所示:

    if __name__ == '__main__':
        print(app.url_map)      #路由规则表
        app.run(port=8080,debug=True)
    

    运行结果如下图所示:


    我们发现URL路由中默认只接收GET、HEAD、OPTIONS请求,

    其中OPTIONS请求方法的主要用途有两个:

    1. 获取服务器支持的HTTP请求方法;

    2. 用来检查服务器的性能。

    由于没有接收POST请求,所以只是修改HTML中form的method值是不行的,会报如下图错误:



    错误大概意思是该方法不被允许请求URL。

    这时我们可以通过在app.route中添加接收post请求的方法,代码如下所示:

    @app.route('/get_data',methods=['POST'])
    def get_data():
        return '提交成功'
    

    这时我们的路由表如下图所示:



    这时路由表中的get_data只接收了POST、OPTIONS两种请求了,当然我们可以设置更多接收请求的方法,代码如下:

    @app.route('/get_data',methods=['POST','GET','...','请求方法'])
    def get_data():
        return '提交成功'
    

    这样我们再访问http://127.0.0.1:8080/register网页中点击提交按钮就不会保存,并会发送post请求了,如下图所示:


    好了,关于Flask框架——response响应及request请求就讲到这里了,下篇文章学习Flask框架——重定向、url_for!!!
    公众号:白巧克力LIN

    相关文章

      网友评论

        本文标题:Flask框架——response响应对象及request对象

        本文链接:https://www.haomeiwen.com/subject/yicetrtx.html