返回顶部
首页 > 资讯 > 后端开发 > Python >FastAPI--路由(2)
  • 458
分享到

FastAPI--路由(2)

路由FastAPI 2023-01-31 08:01:08 458人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

路由方法有 GET, POST, PUT, PATCH, DELETE 和 OPTioNS。import uvicorn from fastapi import FastAPI app&nb

路由方法有 GET, POST, PUT, PATCH, DELETE 和 OPTioNS。

import uvicorn
from fastapi import FastAPI

app = FastAPI()

@app.post("/")
@app.put("/")
@app.delete("/")
@app.get("/")
@app.options("/")
@app.head("/")
@app.patch("/")
@app.trace("/")
async def root():
    return {"message": "Hello 454533333343433World"}

if __name__ == '__main__':
    uvicorn.run(app='main:app', host="127.0.0.1", port=8000, reload=True, debug=True)

 

一般我们的路由分会静态和动态,静态路由就是参数是固定写死,也就是访问地址是写死的,而动态地址,就是需要动态的生成,类似简书的博文的地址94710ed35b92就是动态,其实和Bottle和flask一样。

https://www.jianshu.com/p/94710ed35b92

代码如下:

import uvicorn
from fastapi import FastAPI

app = FastAPI()

@app.get("/items/{item_id}")
async def read_item(item_id):
    return {"item_id": item_id}
if __name__ == '__main__':
    uvicorn.run(app='main:app', host="127.0.0.1", port=8000, reload=True, debug=True)

 

上述的示例代码中的item_id 就是一个动态的参数,你可以随意传一个进来。

Http://127.0.0.1:8000/items/ask

 

1.png

 

然后就是和bottle(微型WEB框架)一样也可以对传入的参数进行数据验证的定义: 如:

import uvicorn
from fastapi import FastAPI

app = FastAPI()

@app.get("/items/{item_id}")
async def read_item(item_id: int):
    return {"item_id": item_id}

if __name__ == '__main__':
    uvicorn.run(app='main:app', host="127.0.0.1", port=8000, reload=True, debug=True)

 

item_id: int 这种情况item_id必须是可以转为int类似的数据,否则,肯定会报错!

http://127.0.0.1:8000/items/ask

1.png

它会给出提示,必须是int类型。返回的HTTP状态码为422

 

关于路由覆盖问题: 如下两个路由地址:

import uvicorn
from fastapi import FastAPI

app = FastAPI()

@app.get("/users/me")
async def read_user_me():
    return {"user_id": "the current user"}

@app.get("/users/{user_id}")
async def read_user(user_id: str):
    return {"被优先匹配到:": user_id}

if __name__ == '__main__':
    uvicorn.run(app='main:app', host="127.0.0.1", port=8000, reload=True, debug=True)

上面两个路由同时存在的话,会按照匹配规则进行匹配。什么意思呢?

@app.get("/users/me") 表示精确匹配

@app.get("/users/{user_id}") 表示模糊匹配

下面我来验证一下。

http://127.0.0.1:8000/users/me

 

1.png

 可以看到,它匹配了是第一条。注意:只有正常情况下,才会返回HTTP 200

http://127.0.0.1:8000/users/123

 

1.png

 发现它是匹配的第2个路径。

 

查询路径参数和参数校验

关于查询参数,其实就是在使用POSTMAN 提交的时候的参数信息: 如:

http://127.0.0.1:8000/items/?skip=0&limit=10

skip=0&limit 就是所谓的查询参数。

import uvicorn
from fastapi import FastAPI

app = FastAPI()

fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]

@app.get("/items/")
async def read_item(skip: int = 0, limit: int = 10):
    return fake_items_db[skip: skip + limit]

if __name__ == '__main__':
    uvicorn.run(app='main:app', host="127.0.0.1", port=8000, reload=True, debug=True)

 

第一种访问的情况:

http://127.0.0.1:8000/items/

1.png

我们发现,它返回的是list所有数据。这是为什么呢?来,我来细细品一下代码。

在这个url中,并没有传入参数skip和limit,那么它会使用默认值,分别是0,100

那么fake_items_db[skip: skip + limit] 等同于fake_items_db[0:10]

看到这里,学过Python基础知识的,应该明白,这是列表切片。

 

第二种访问情况:

http://127.0.0.1:8000/items/?skip=1

 

1.png

返回了最后2条数据,第一条没有显示。因为此时fake_items_db[skip: skip + limit] 等同于fake_items_db[1:10]

 

第三种访问情况:

http://127.0.0.1:8000/items/?skip=abc

 

1.png

 提示错误信息,值不是整形,HTTP状态码为:422

 

多路径和查询参数

所谓的多路径和查询参数就是URL上包含了有动态的参数,还有需要通过&分隔符提交的参数,这情况,通常再GET提交的中也很常见,那么如何处理呐?

import uvicorn
from fastapi import FastAPI

app = FastAPI()

@app.get("/users/{user_id}/items/{item_id}")
async def read_user_item(
    user_id: int, item_id: str, q: str = None, short: bool = False
):
    item = {"item_id": item_id, "owner_id": user_id}
    if q:
        item.update({"q": q})
    if not short:
        item.update(
            {"description": "This is an amazing item that has a long description"}
        )
    return item

if __name__ == '__main__':
    uvicorn.run(app='main:app', host="127.0.0.1", port=8000, reload=True, debug=True)

 

请求:

http://127.0.0.1:8000/users/123456/items/items_xinxiid/?q=assa&short=True

1.png


 注意:item.update 是python字典的一个语法。存在即更新,不存在,即添加。

其他逻辑我就不解释了,仔细看也能明白。

 

请求:

http://127.0.0.1:8000/users/123456/items/items_xinxiid/?q=assa&short=False

1.png

 由于short=False,因此description值做了更新操作。

 

路径参数和查询参数的必选和可选

参数的可选和必选主要是通过是否给默认值来决定的,如:

import uvicorn
from fastapi import FastAPI

app = FastAPI()

@app.get("/items/{item_id}")
async def read_user_item(item_id: str, needy: str):
    item = {"item_id": item_id, "needy": needy}
    return item

if __name__ == '__main__':
    uvicorn.run(app='main:app', host="127.0.0.1", port=8000, reload=True, debug=True)

 

上述的代码中 needy 没有给与默认的值,当个没提交这个值的时候,会提示错误:

http://127.0.0.1:8000/items/123456

1.png

还可以定义可选参数和必选的参数的提交类型: 其中还可以使用Optional来定义需要提交的数据类型: 如:

import uvicorn
from fastapi import FastAPI
from typing import Optional

app = FastAPI()

@app.get("/items/{item_id}")
async def read_user_item(item_id: str, limit: Optional[int] = None):
    item = {"item_id": item_id, "limit": limit}
    return item

if __name__ == '__main__':
    uvicorn.run(app='main:app', host="127.0.0.1", port=8000, reload=True, debug=True)

 

我们把查询参数limit规定为了int类型,但是它是可选的的参数,设置为了None:

http://127.0.0.1:8000/items/ask

 

1.png

如果传入的参数类型不对,就会报错

http://127.0.0.1:8000/items/ask?limit=422w

1.png


路径参数的枚举

import uvicorn
from fastapi import FastAPI
from enum import Enum

app = FastAPI()

class ModelName(str, Enum):
    alexnet = "alexnet"
    resnet = "resnet"
    lenet = "lenet"

@app.get("/model/{model_name}")
async def get_model(model_name: ModelName):
    if model_name == ModelName.alexnet:
        return {"model_name": model_name, "message": "Deep Learning FTW!"}
    if model_name.value == "lenet":
        return {"model_name": model_name, "message": "LeCNN all the images"}
    return {"model_name": model_name, "message": "Have some residuals"}

if __name__ == '__main__':
    uvicorn.run(app='main:app', host="127.0.0.1", port=8000, reload=True, debug=True)

 

访问地址:

http://127.0.0.1:8000/model/alexnet

1.png

 可以发现,它匹配了第一条规则。

 

查询参数Query参数的其他校验

在以前通常是使用wtfORM来定义提交的字段信息的类似或可选或长度类型。在Fastapi里面,我们是通过: from fastapi import FastAPI, Query 中的Query来定义,如:

import uvicorn
from fastapi import FastAPI, Query

app = FastAPI()

@app.get("/items/")
async def read_items(q: str = Query(None, min_length=3,max_length=50,regex="^fixedquery")):
    results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
    if q:
        results.update({"q": q})
    return results

if __name__ == '__main__':
    uvicorn.run(app='main:app', host="127.0.0.1", port=8000, reload=True, debug=True)

注意:参考文章中有一个小错误,regex必须在Query里面才能生效。

 

参数解释:

q: str = Query(None, min_length=3,max_length=50,regex="^fixedquery") 意思是:q参数是可选的参数,但是如果填写的话,最大长度必须是小于50内,且最小的长度必须大于3: 且需要符合regex的匹配

当然None可以修改为其他默认值,可以写如:

q: q: str = Query('xiaozhong', min_length=3,max_length=50,regex="^fixedquery"))

注意:如果正则为^fixedquery$,表示精确匹配,q必须是fixedquery才行。前后左右多一点都不行。

为了下面的测试,我去掉了$

 

不传q的情况下:

http://127.0.0.1:8000/items/

1.png

传q的情况下且长度大于50:

http://127.0.0.1:8000/items/?q=fixedquery333333333333333333333333333333333333333333

1.png

传q的情况下且长度小于3:

http://127.0.0.1:8000/items/?q=fixedquery333

1.png


查询参数Query的参数正则校验

http://127.0.0.1:8000/items/?q=433

1.png

查询参数Query参数多值列表

 一般在我们的接口中很少说同一个参数提交多个值如:

http://127.0.0.1:8000/items/?q=foo&q=bar

但也不排查这种情况的存在,所以也可以定义我们的参数类似必须是列表的形式:

import uvicorn
from fastapi import FastAPI, Query
from typing import List

app = FastAPI()


@app.get("/items/")
async def read_items(q: List[str] = Query(["foo", "bar"])):
    # <!--也可以使用list直接代替List[str]:-->
    query_items = {"q": q}
    return query_items

if __name__ == '__main__':
    uvicorn.run(app='main:app', host="127.0.0.1", port=8000, reload=True, debug=True)

 

默认值:

http://127.0.0.1:8000/items/

1.png

非默认值:

http://127.0.0.1:8000/items/?q=123&q=456

1.png

 

路径参数的其他校验方式

对于查询参数可以通过Query,同样对于路径参数也可以使用Fastapi自带的Path来进行校验。

import uvicorn
from fastapi import FastAPI, Path

app = FastAPI()

@app.get("/items/{item_id}")
async def read_items(
    q: str, item_id: int = Path(..., title="The ID of the item to get")
):
    results = {"item_id": item_id}
    if q:
        results.update({"q": q})
    return results

if __name__ == '__main__':
    uvicorn.run(app='main:app', host="127.0.0.1", port=8000, reload=True, debug=True)

http://127.0.0.1:8000/items/11?q=22

1.png

 

 对于路径参数校验中,还可以对item_id进行大于或等于的校验如:

import uvicorn
from fastapi import FastAPI, Path

app = FastAPI()

@app.get("/items/{item_id}")
async def read_items(
        *, item_id: int = Path(..., title="The ID of the item to get", ge=1), q: str):
    results = {"item_id": item_id}
    if q:
        results.update({"q": q})
    return results

if __name__ == '__main__':
    uvicorn.run(app='main:app', host="127.0.0.1", port=8000, reload=True, debug=True)

 

在上面代码意思是,item_id必须是整数,而且必须大于等于1。其中ge=1表示大于等于1

 

传入0就会报错

http://127.0.0.1:8000/items/0?q=aa

1.png

 

 

 

本文参考链接:

http://www.zyiz.net/tech/detail-119883.html


--结束END--

本文标题: FastAPI--路由(2)

本文链接: https://lsjlt.com/news/193719.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • FastAPI--路由(2)
    路由方法有 GET, POST, PUT, PATCH, DELETE 和 OPTIONS。import uvicorn from fastapi import FastAPI app&nb...
    99+
    2023-01-31
    路由 FastAPI
  • 详解Angular路由之子路由
    目录一、子路由语法二、实例1、新建2个组件修改其内容2、修改路由配置3、修改product.component.ts的模版一、子路由语法 二、实例 在商品详情页面,除了显示商品id...
    99+
    2024-04-02
  • thinkphp8路由
    thinkphp8已出来有好一段时间了。这些天闲来无事,研究了下tp8的路由。默认情况下,tp8的路由是在route\app.php的文件里。但在实际工作中,我们并不会这样子去写路由。因为这样不好管理...
    99+
    2023-10-01
    android
  • Node.js 路由
    Node.js 路由我们要为路由提供请求的URL和其他需要的GET及POST参数,随后路由需要根据这些数据来执行相应的代码。因此,我们需要查看HTTP请求,从中提取出请求的URL以及GET/POST参数。这一功能应当属于路由还是服务器(甚至...
    99+
    2023-06-03
  • react路由守卫的实现(路由拦截)
    react不同于vue,通过在路由里设置meta元字符实现路由拦截。在使用 Vue ,框架提供了路由守卫功能,用来在进入某个路有前进行一些校验工作,如果校验失败,就跳转到 404 或...
    99+
    2024-04-02
  • python_telnet h3c 路由
    #!/usr/bin/env python import telnetlib import time def h3c_telnet(ip,username,password1,password2,type):     try:       ...
    99+
    2023-01-31
    路由 python_telnet h3c
  • Vue中的动态路由匹配路由问题
    目录vue-router 动态路由匹配总结vue-router 动态路由匹配 我们经常需要把某种模式匹配到的所有路由,全都映射到同个组件。 例如,我们有一个 User 组件,对于所有...
    99+
    2022-12-09
    Vue动态路由 Vue匹配路由 Vue路由
  • Flutter实现页面路由及404路由拦截
    为什么要使用路由 在之前我们的代码中,页面跳转使用的代码如下所示: Navigator.of(context).push( MaterialPageRoute(builde...
    99+
    2024-04-02
  • vuejs路由的传参及路由props配置详解
    目录前言方式1-使用query方式命名路由方式2-路由的params参数query与params的区别路由的props配置路由配置的布尔模式路由配置的对象模式路由配置函数模式总结前言...
    99+
    2024-04-02
  • GateWay路由规则与动态路由详细介绍
    目录1、路由规则2、动态路由1、路由规则 Spring Cloud GateWay 帮我们内置了很多 Predicates功能,实现了各种路由匹配规则(通过 Header、请求参数等...
    99+
    2024-04-02
  • vue如何实现父级路由跳转子路由
    今天小编给大家分享一下vue如何实现父级路由跳转子路由的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。子路由配置首先,我们需要...
    99+
    2023-07-05
  • 详解VueRouter 路由
    目录vue router1、认识路由的概念1.1、何为路由1.2、后端路由阶段1.3、前端路由阶段1.4、前端渲染和后端渲染?2、前端路由的规则2.1、URL的hash 方式2.2、...
    99+
    2024-04-02
  • laravel路由配置
    在laravel框架中,如何访问指定控制器中的信息内,在laravel框架中如果你想要访问指定的控制器内的方法时,你需要进行路由注册,只有进行过路由注册的地址才能够访问,不然的话会显示404,那么如何进行路由注册呢,下面的内容就是如何进行路...
    99+
    2023-09-02
    laravel php 前端 Powered by 金山文档
  • diango路由分发
    1个Django 项目里面有多个APP目录大家共有一个 url容易造成混淆,于是路由分发让每个APP的拥有了自己单独的url例如:将blog应用的url分离出来1、进入mysite目录,修改urls.py文件from django...
    99+
    2023-01-30
    路由 diango
  • Django之路由层
      url配置就像Django所支撑网站的目录。它的本质是url与要被该url调用的视图函数之间的映射表;通过这个映射表可以告知Django,对于客户端发来的某个url该执行那些代码。   一、简单的路由配置 from django.u...
    99+
    2023-01-30
    路由 Django
  • Flask路由&视图
    1 路由  1.1app.url_map 查看所有路由 from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): ...
    99+
    2023-01-31
    视图 路由 Flask
  • H3C路由命令
    这里囊括了华三路由器基本的操作命令,仅供大家参考。...
    99+
    2023-01-31
    路由 命令 H3C
  • nodejs设置路由
    随着前端技术的快速发展,越来越多的人开始关注后端开发。而Node.js作为一个轻量级的后端框架,已经受到了越来越多开发者的认可与使用。在Node.js中,设置路由是非常重要的一个部分。路由决定了一个请求应该由哪个处理程序来处理。本文将详细介...
    99+
    2023-05-14
  • golang路由错误
    Golang是近年来备受关注的一门编程语言,它的简洁的语法和快速的编译速度备受程序员的称赞。然而在使用Golang开发Web应用时,我们可能会遇到路由错误的情况,下面我们就来探讨一下可能遇到的错误以及如何解决。一、路由匹配错误在Golang...
    99+
    2023-05-18
  • golang实现路由
    Golang是一种非常流行的编程语言,它提供了非常强大的框架和库,使得开发人员能够很方便地创建高性能的Web应用程序。在Golang中,路由是Web应用程序的核心组件之一,它能够实现URL的映射,将请求发送到正确的处理程序上。在本文中,我们...
    99+
    2023-05-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作