Flask入门–路由请求响应

路由参数

路由基础用法

@routes.route('/')
def index():
    return 'Hello, World!'

这段代码定义了一个基本的路由,当用户访问应用的根URL(”/”)时,index函数会被调用并返回”Hello, World!”。这里routes.route('/')指定了URL路径与处理函数之间的映射关系。

路由参数

@routes.route('/user/<username>')
def user_profile(username):
    return f'Hello, {username}!'

路由中可以包含变量部分,以便捕获URL中动态变化的部分。在这个例子中,<username>是一个动态部分,它可以匹配任何非斜杠字符序列。当这个路由被访问时,比如通过/user/johnjohn就会作为参数传递给user_profile函数,并在响应中显示出来。

路由默认值及参数类型

@routes.route('/post/<int:post_id>')
def show_post(post_id):
    return f'Post {post_id}'

Flask允许为路由参数指定类型,这有助于自动类型转换和验证。例如,<int:post_id>表示post_id应该被解析为一个整数。如果URL中这部分不是整数,Flask会返回一个404错误。其他可用的类型包括string(默认)、floatpathuuidany。这样的设计提高了代码的安全性和健壮性。

参数类型 描述
string 默认类型,匹配除了斜杠(/)之外的任何字符串。
int 匹配一个整数。自动转换为int类型,并且如果URL部分不能转换为整数,会引发404错误。
float 匹配一个浮点数。类似于int,但匹配的是小数。如果不能转换为浮点数,也会引发404错误。
path 类似于string,但同时也匹配斜杠(/)。这对于需要匹配包含路径分隔符的URL部分非常有用,例如文件路径。
uuid 匹配一个UUID字符串。确保传入的字符串符合UUID的格式,否则返回404错误。
any 匹配任何字符串,包括空字符串。这个类型很少直接使用,因为默认的string类型几乎等效,除非你需要明确表示可以是空值。

请求方法

@routes.route('/login', methods=['GET''POST''PUT''DELETE'])
def login():
    if request.method == 'POST':
        return 'POST'
    elif request.method == 'GET':
        return 'GET'
    elif request.method == 'PUT':
        return 'PUT'
    elif request.method == 'DELETE':
        return 'DELETE'

HTTP协议定义了多种请求方法,如GET、POST等,用于表示客户端向服务器发送的不同类型的请求。通过在route装饰器中指定methods参数,你可以限制该路由只接受特定类型的请求。在这个例子中,/login路径可以响应GET、POST、PUT和DELETE请求,根据请求方法的不同返回不同的消息。request.method属性用于检测当前请求的方法。

request请求

工具

请求测试工具我使用的是Postman,或者创建后缀名为.http的文件。

Postman安装包路径:

网盘路径: https://pan.xunlei.com/s/VNxJbqhA5OencgUXmmdD3Rg3A1
提取码:8295

Flask 请求详解笔记

基本概念

在 Flask 中,request 对象用于处理来自客户端的所有请求信息。它封装了关于请求的各种细节,使开发者能够轻松访问请求相关的数据。以下是一些关键属性和方法的详细说明:

  • • request.method:表示 HTTP 请求的方法,常见的有 'GET''POST' 等。

  • • request.path:返回请求的路径部分,不包含查询字符串,例如 /user/profile

  • • request.full_path:提供请求的完整路径,包含查询字符串,如 /user/profile?search=query

  • • request.args:一个字典,用于存储查询字符串中的参数,例如 ?key=value&another=value2

  • • request.form:当请求方法为 'POST' 且内容类型为 'application/x-www-form-urlencoded' 或 'multipart/form-data' 时,用于存储表单数据的字典。

  • • request.files:处理上传文件的字典对象,每个键对应一个上传的文件。

  • • request.headers:一个字典对象,包含所有 HTTP 请求头信息。

  • • request.cookies:一个字典,存储了请求中的所有 cookies。

  • • request.data:请求的原始数据,适用于非表单数据,如直接发送的 JSON 数据。

  • • request.json:如果请求的内容类型是 'application/json',此属性会自动解析并返回 JSON 数据。

  • • request.remote_addr:客户端的 IP 地址。

  • • request.user_agent:客户端的 User-Agent 字符串,可以用来识别浏览器或爬虫等。

  • • request.url:完整的请求 URL,包括协议、域名、路径及查询字符串。

  • • request.scheme:请求使用的协议,如 'http' 或 'https'

  • • request.host:请求的主机名加端口号。

示例代码解析

GET 请求处理

@routes.route('/get/search')
def search():
    # 从查询字符串中获取 'q' 参数
    q = request.args.get('q')
    # 返回搜索结果的提示信息
    return f'Search for: {q}'
    

# data.http请求文件:写 GET http://localhost:5000/get/search?q=apple

此例展示了如何从 GET 请求的查询字符串中获取参数,并返回一个简单的响应。data.http文件每次写完一个请求后用三个###用来分割。比如:

GET http://localhost:5000/get/search?q=apple

###

POST http://localhost:5000/post/search
Content-Type: application/json

{
"user":"艾则麦提",
"age":20
}

POST 请求处理

@routes.route("/post/search", methods=["POST"])
def search_post():
    # 从 POST 请求的表单数据中获取 'user' 和 'age'
    user = request.json.get("user")
    age = request.json.get("age")
    # 返回用户年龄信息
    return f"{user}今年{age}岁了!"

这段代码展示了如何处理表单提交的 POST 请求,提取表单字段值并构造响应。

data.http

POST http://localhost:5000/post/search
Content-Type: application/json

{
"user":"艾则麦提",
"age":20
}

获取请求头和其它信息

@routes.route("/head/data")
def get_header_data():
    # 返回请求头,获取指定的标头,request.headers.get('标头名')
    headers = request.headers
    # 获取ip
    ip = request.remote_addr
    # 获取请求方式
    method = request.method
    # 获取请求路径
    path = request.path
    # 获取请求地址
    url = request.url
    # 获取请求协议
    scheme = request.scheme
    # 获取请求主机
    host = request.host
    # 组合信息并返回
    log_message = (
        f"客户端IP: {ip}n"
        f"请求方法: {method}n"
        f"请求路径: {path}n"
        f"完整URL: {url}n"
        f"协议类型: {scheme}n"
        f"主机信息: {host}n"
        f"请求头详情:n{headers}n"
    )
    return log_message

响应

直接返回字符串

在 Flask 中,最简单的响应方式是直接从视图函数返回一个字符串。Flask 会自动将这个字符串转换为 HTML 响应。

@routes.route('/response')
def get_response():
    return 'This is a response'

在这个例子中,当用户访问 /response 路径时,get_response 函数会被调用,并返回字符串 'This is a response'。Flask 会创建一个包含这个字符串的 HTML 响应,并发送给客户端。

使用 flask.make_response 创建响应对象

如果你需要更细粒度的控制响应,可以使用 flask.make_response 函数来创建一个响应对象。

@routes.route('/response2')
def get_response2():
    response = make_response('This is a response')
    response.headers['Content-Type'] = 'text/plain'
    return response

在这个例子中,我们使用 make_response 函数创建了一个响应对象,并设置了 Content-Type 头为 'text/plain',这样客户端就会知道返回的内容是纯文本。

使用 flask.Response 创建响应对象

flask.Response 类是创建响应对象的另一种方式。它提供了更多的灵活性,允许你设置状态码、响应头等。

@routes.route('/json-response')
def json_response():
    data = {'key''value'}
    response = Response(json.dumps(data), content_type='application/json')
    return response

在这个例子中,我们创建了一个 JSON 响应。首先,我们使用 json.dumps 将 Python 字典转换为 JSON 字符串,然后创建一个 Response 对象,并设置 content_type 为 'application/json'

JSON响应

Flask 提供了一个便捷的函数 jsonify 来创建 JSON 响应。

@routes.route('/json-response2')
def json_response2():
    data = {'key''value'}
    return jsonify(data)

在这个例子中,我们使用 jsonify 函数将 Python 字典转换为 JSON 响应。jsonify 会自动设置 Content-Type 头为 'application/json'

错误处理与自定义错误响应

Flask 允许你自定义错误页面,通过使用 errorhandler 装饰器。

@routes.errorhandler(404)
def page_not_found(e):
    return jsonify(error='Not found'), 404

在这个例子中,我们定义了一个处理 404 错误的函数。当用户请求一个不存在的页面时,这个函数会被调用,并返回一个自定义的 JSON 错误响应,状态码为 404。

设置状态码

你可以通过在视图函数中返回一个元组来设置响应的状态码。

@routes.route('/status-code')
def status_code():
    return 'This is a response'401

在这个例子中,我们返回了一个元组,其中第一个元素是响应内容,第二个元素是状态码。这将返回一个状态码为 401 的响应。

重定向

你可以使用 redirect 函数来重定向用户到另一个 URL。

@routes.route('/redirect')
def redirect_example():
    return redirect('https://www.baidu.com')

在这个例子中,用户会被重定向到 https://www.baidu.com

文件下载

Flask 允许你发送文件给客户端,实现文件下载功能。

@routes.route('/download')
def download_file():
    file_path = 'static/Flask入门--路由.md'
    return send_file(file_path, as_attachment=True)

在这个例子中,我们使用 send_file 函数发送一个文件给客户端,并设置 as_attachment 参数为 True,这样浏览器就会提示用户下载文件。

项目资料与代码

git clone https://gitee.com/ezemeti/FlaskLearn.git

原文始发于微信公众号(索隆程序员):Flask入门–路由请求响应

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/289361.html

(0)
葫芦侠五楼的头像葫芦侠五楼

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!