2Flask请求与响应处理

Flask 请求与响应处理:深入了解 Request 和 Response

在现代 Web 开发中,Flask 是一个轻量级的 Web 框架,因其简单、灵活的特性而受到广泛的欢迎。理解 Flask 中的请求和响应对象是开发高效 Web 应用的基础。本文将深入探讨 Flask 中的请求(Request)和响应(Response)对象,学习如何获取请求数据、如何处理响应以及如何自定义响应头、状态码和 Cookies。


1. 请求对象 (Request)

在 Flask 中,每个 HTTP 请求都会由一个 Request 对象表示。这个对象包含了所有关于 HTTP 请求的信息,包括请求方法(GET, POST, PUT, DELETE 等)、URL、表单数据、文件上传内容等。

获取请求数据

Flask 提供了多种方式来获取请求中的数据,常见的有以下几种:

  • 表单数据: 表单数据通常通过 POST 请求提交,可以通过 request.form 访问。

    from flask import Flask, request
    
    app = Flask(__name__)
    
    @app.route('/login', methods=['POST'])
    def login():
        username = request.form['username']
        password = request.form['password']
        return f'Username: {username}, Password: {password}'
    

    在这个例子中,表单数据会被提取并返回给客户端。

  • JSON 数据: 如果客户端发送的是 JSON 格式的数据(例如通过 application/json Content-Type),可以通过 request.get_json() 方法获取数据。

    @app.route('/api/data', methods=['POST'])
    def api_data():
        data = request.get_json()
        return f'Received data: {data}'
    

    在这个例子中,Flask 会自动解析请求体中的 JSON 数据并将其转换为 Python 字典。

  • Params数据:如果客户端发送的是Params数据,(例如地址传参),可以通过request.args.get('name')

    @role_bp.route('/list', methods=['GET'])
    async def role_list():
        query = request.args.get('name')    
        return    await role_service.get_role_list(query)
    
  • 文件上传: 如果客户端上传文件(通常是通过 multipart/form-data 编码),可以通过 request.files 获取文件对象。

    @app.route('/upload', methods=['POST'])
    def upload_file():
        file = request.files['file']
        file.save(f'./uploads/{file.filename}')
        return 'File uploaded successfully'
    

    这里,文件被保存到服务器的本地目录中。

请求头和其他信息

你还可以从 request 对象获取请求头信息,例如获取客户端发送的 User-AgentAccept-Language 等。

@app.route('/user-agent', methods=['GET'])
def user_agent():
    user_agent = request.headers.get('User-Agent')
    return f'Your User-Agent is {user_agent}'

2. 响应对象 (Response)

Flask 中的 Response 对象代表了服务器向客户端返回的 HTTP 响应。一个 Flask 路由处理函数的默认返回值是一个字符串,Flask 会自动将其转换为 Response 对象。

设置响应内容

返回一个字符串时,Flask 会自动将其转换为响应体,但你也可以显式设置响应内容、响应头、状态码等。

from flask import Flask, Response

@app.route('/custom-response', methods=['GET'])
def custom_response():
    return Response('Hello, Flask!', content_type='text/plain', status=200)

在这个例子中,我们创建了一个自定义的 Response,并设置了响应体、内容类型和状态码。

设置响应头

你可以通过 Response 对象设置响应头,或者使用 make_response() 方法来手动构造响应。

from flask import make_response

@app.route('/custom-header', methods=['GET'])
def custom_header():
    response = make_response('Custom header set')
    response.headers['X-Custom-Header'] = 'Hello'
    return response

此示例会在响应头中添加一个名为 X-Custom-Header 的自定义字段。

设置状态码

Flask 会根据路由处理函数的返回值自动设置状态码。如果你需要自定义状态码,可以显式设置。

@app.route('/created', methods=['POST'])
def created():
    return 'Resource created successfully', 201

在这个例子中,状态码 201 表示资源已成功创建。

设置 Cookie

Flask 允许你轻松地设置和读取 Cookies。通过 response.set_cookie() 方法,你可以在响应中设置 Cookies。

@app.route('/set-cookie', methods=['GET'])
def set_cookie():
    response = make_response('Cookie has been set!')
    response.set_cookie('username', 'flask_user')
    return response

在这个例子中,Flask 会设置一个名为 username 的 Cookie。


3. 请求和响应的常见组合

在一个完整的 Web 应用中,请求和响应通常是配合使用的。例如,在表单提交后,接收并处理数据后返回一个响应:

@app.route('/submit', methods=['POST'])
def submit():
    username = request.form['username']
    password = request.form['password']
    response = make_response(f'Welcome, {username}!')
    response.set_cookie('username', username)
    return response

在这个例子中,用户提交表单后,服务器会提取表单数据,设置 Cookie 并返回响应。

Flask 中的请求和响应处理是 Web 开发中至关重要的部分。通过 Request 对象,我们可以获取来自客户端的各种请求数据(如表单、JSON、文件上传等),而通过 Response 对象,我们可以灵活地设置响应内容、状态码、响应头和 Cookies。

掌握 Flask 请求和响应的基本操作将为你开发出更复杂和灵活的 Web 应用打下坚实的基础

更多请关注公众号 “学GIS的小宝同学”
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值