由网友(早起的鸟儿硬邦邦)分享简介:假设我有以下观点,from fastapi import FastAPIapp = FastAPI()@app.get('/hello/')def hello_world():return {"msg": "Hello World"}@app.get('/hello/{number}/')def hello_wo...![cisco 路由器web界面没视图](https://p.xsw88.cn/allimgs/daicuo/20230903/3136.png)
方法1:使用
当您能够在当前上下文中访问方法2:
假设我有以下观点,
from fastapi import FastAPI
app = FastAPI()
@app.get('/hello/')
def hello_world():
return {"msg": "Hello World"}
@app.get('/hello/{number}/')
def hello_world_number(number: int):
return {"msg": "Hello World Number", "number": number}
我一直在FlASK和Django中使用这些函数
Flask:url_for(...)
Django: reverse(...)
![cisco 路由器web界面没视图](https://p.xsw88.cn/allimgs/daicuo/20230903/3136.png)
那么,如何以类似的方式获取/构建hello_world
和hello_world_number
的URL?
推荐答案
我们有位于starlette包内的Router.url_path_for(...)
方法
方法1:使用FastAPI
实例
当您能够在当前上下文中访问FastAPI
实例时,此方法非常有用。(感谢@Yagizcan Degirmenci)
from fastapi import FastAPI
app = FastAPI()
@app.get('/hello/')
def hello_world():
return {"msg": "Hello World"}
@app.get('/hello/{number}/')
def hello_world_number(number: int):
return {"msg": "Hello World Number", "number": number}
print(app.url_path_for('hello_world'))
print(app.url_path_for('hello_world_number', number=1}))
print(app.url_path_for('hello_world_number', number=2}))
# Results
/hello/
/hello/1/
/hello/2/
缺陷
如果我们使用APIRouter
,router.url_path_for('hello_world')
可能无法工作,因为router
不是FastAPI
类的实例。也就是说,我们必须有FastAPI
实例来解析URL
方法2:Request
实例
当您能够访问Request
实例(传入请求)时,此方法非常有用,通常是在视图中。
from fastapi import FastAPI, Request
app = FastAPI()
@app.get('/hello/')
def hello_world():
return {"msg": "Hello World"}
@app.get('/hello/{number}/')
def hello_world_number(number: int):
return {"msg": "Hello World Number", "number": number}
@app.get('/')
def named_url_reveres(request: Request):
return {
"URL for 'hello_world'": request.url_for("hello_world"),
"URL for 'hello_world_number' with number '1'": request.url_for("hello_world_number", number=1),
"URL for 'hello_world_number' with number '2''": request.url_for("hello_world_number", number=2})
}
# Result Response
{
"URL for 'hello_world'": "http://0.0.0.0:6022/hello/",
"URL for 'hello_world_number' with number '1'": "http://0.0.0.0:6022/hello/1/",
"URL for 'hello_world_number' with number '2''": "http://0.0.0.0:6022/hello/2/"
}
缺陷
我们必须在每个(或必需的)视图中包含request
参数以解析URL,这可能会给开发人员带来难看的感觉。相关推荐
最新文章