我尝试使用 uvicorn 网络服务器运行 FastAPI,但它引发了错误。
我运行这个命令,
uvicorn api:app --reload --host 0.0.0.0
但是终端有错误。
Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
Started reloader process [23445]
Error loading ASGI app. Could not import module "api".
Stopping reloader process [23445]
Run Code Online (Sandbox Code Playgroud)
我真的很感激任何建议或建议
如果出现 HTTPException,如何使用 FastAPI 重定向请求?
在 Flask 中我们可以这样实现:
@app.errorhandler(404)
def handle_404(e):
if request.path.startswith('/api'):
return render_template('my_api_404.html'), 404
else:
return redirect(url_for('index'))
Run Code Online (Sandbox Code Playgroud)
或者在 Django 中我们可以使用 django.shortcuts:
from django.shortcuts import redirect
def view_404(request, exception=None):
return redirect('/')
Run Code Online (Sandbox Code Playgroud)
我们如何使用 FastAPI 来实现这一目标?
我从 Typescript 中知道了一个概念,称为“受歧视的联合”。这是你放置 2 个结构体(类等)的地方,并且类型是根据结构体的值决定的。我正在尝试通过Pydantic验证在FastAPI中实现类似的目标。我可以收到两种不同的请求负载。是其中之一还是另一个取决于变量。如果是,则应由 验证,如果是,则应由 验证。我该如何实现这一目标?找不到任何其他解决方案。accountType
creative
RegistrationPayloadCreative
brand
RegistrationPayloadBrand
问题是它要么返回
unexpected value; permitted: 'creative' (type=value_error.const; given=brand; permitted=('creative',))
或者它根本不起作用。
class RegistrationPayloadBase(BaseModel):
first_name: str
last_name: str
email: str
password: str
class RegistrationPayloadCreative(RegistrationPayloadBase):
accountType: Literal['creative']
class RegistrationPayloadBrand(RegistrationPayloadBase):
company: str
phone: str
vat: str
accountType: Literal['brand']
class A(BaseModel):
b: Union[RegistrationPayloadBrand, RegistrationPayloadCreative]
def main():
A(b={'first_name': 'sdf', 'last_name': 'sdf', 'email': 'sdf', 'password': 'sdfds', 'accountType': 'brand'})
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud) 我正在通过挂载从FastAPI提供React应用程序
app.mount("/static", StaticFiles(directory="static"), name="static")
@app.route('/session')
async def renderReactApp(request: Request):
return templates.TemplateResponse("index.html", {"request": request})
Run Code Online (Sandbox Code Playgroud)
通过这个 React 应用程序得到服务,React 路由在客户端也可以正常工作,但是一旦客户端重新加载一个没有在服务器上定义但在 React 应用程序中使用的路由,FastAPI 返回not found
来解决这个问题,我做了如下的一些事情。
@app.route('/network')
@app.route('/gat')
@app.route('/session')
async def renderReactApp(request: Request):
return templates.TemplateResponse("index.html", {"request": request})
Run Code Online (Sandbox Code Playgroud)
但这对我来说似乎很奇怪和错误,因为我需要在后端和前端添加每条路线。
我确定@flask_app.add_url_rule('/<path:path>', 'index', index)
FastAPI 中必须有类似 Flask的东西,它将为所有任意路径提供服务
我已关注有关 Oauth2 的文档,但它没有描述添加客户端 id 和密钥的过程
https://fastapi.tiangolo.com/advanced/security/oauth2-scopes/
这是做什么的
class UserInDB(User):
hashed_password: str
Run Code Online (Sandbox Code Playgroud)
从原来的例子
I saw a tweet from Raymond Hettinger yesterday. He used __set_name__
.
When I define __set_name__
method for my Class, the name becomes the instance's name. The owner became Foo
, which is also expected but I couldn't figure out when and how this is useful.
class Bar:
def __set_name__(self, owner, name):
print(f'{self} was named {name} by {owner}')
class Foo:
x = Bar()
y = Bar()
Run Code Online (Sandbox Code Playgroud)
That prints
<__main__.Bar object at 0x7f48f2968820> was named x by <class '__main__.Foo'>
<__main__.Bar object …
Run Code Online (Sandbox Code Playgroud) 我想解决的问题:
我有一个部署到 GCP Cloud Run 的 Fast API 应用程序。直到昨天它一直工作正常,我真的不知道出了什么问题。当我读入.pkl
文件时,问题似乎从这一行开始
model = pickle.load(open(os.path.join('models', 'appartementen.pkl'), 'rb'))
回溯:
File "pandas/_libs/internals.pyx", line 572, in pandas._libs.internals.BlockManager.__cinit__: TypeError: __cinit__() takes at least 2 positional arguments (0 given) at <module> (/app/src/api/util.py:25)
at <module> (/app/src/api/main.py:8) at
_call_with_frames_removed (<frozen importlib._bootstrap>:219) at exec_module (<frozen importlib._bootstrap_external>:728)
at _load_unlocked (<frozen importlib._bootstrap>:677)
at _find_and_load_unlocked (<frozen importlib._bootstrap>:967)
at _find_and_load (<frozen importlib._bootstrap>:983)
at _gcd_import (<frozen importlib._bootstrap>:1006)
at import_module (/usr/local/lib/python3.7/importlib/__init__.py:127)
at import_app (/usr/local/lib/python3.7/site-packages/gunicorn/util.py:358) at load_wsgiapp (/usr/local/lib/python3.7/site-packages/gunicorn/app/wsgiapp.py:39)
at load (/usr/local/lib/python3.7/site-packages/gunicorn/app/wsgiapp.py:49)
at wsgi (/usr/local/lib/python3.7/site-packages/gunicorn/app/base.py:67)
at load_wsgi (/usr/local/lib/python3.7/site-packages/gunicorn/workers/base.py:144) …
Run Code Online (Sandbox Code Playgroud) 在 FastAPI 中传递字典列表,一般我们会定义一个 pydantic 模式,并会提到
param: List[schema_model]
Run Code Online (Sandbox Code Playgroud)
我面临的问题是我有文件要附加到我的请求中。我找不到在路由器功能中定义架构和文件上传的方法。为此,我将所有参数(请求正文)定义为正文参数,如下所示。
@router.post("/", response_model=DataModelOut)
async def create_policy_details(request:Request,
countryId: str = Body(...),
policyDetails: List[dict] = Body(...),
leaveTypeId: str = Body(...),
branchIds: List[str] = Body(...),
cityIds: List[str] = Body(...),
files: List[UploadFile] = File(None)
):
Run Code Online (Sandbox Code Playgroud)
当我使用 postman 的 form-data 选项发送请求时,它为 policyDetails 参数显示“0:value is not a valid dict”。我正在发送 [{"name":"name1","department":"d1"}]。它说不是有效的字典,即使我发送有效的字典。谁可以帮我这个事?DataModelOut 类
class DataModelOut(BaseModel):
message: str = ""
id: str = ""
input_data: dict = None
result: List[dict] = []
statusCode: int
Run Code Online (Sandbox Code Playgroud) 假设我有这样的项目结构
src
??? app
??? main.py
??? db
? ??? database.py
??? models
? ??? model_a.py
? ??? model_b.py
??? tests
??? test_x.py
??? test_y.py
Run Code Online (Sandbox Code Playgroud)
我想检查哪个文件使用了另一个文件中的类或函数。我在 main.py 中有一个名为 Test 的类
class Test:
pass
Run Code Online (Sandbox Code Playgroud)
我在model_a
,
from ..main import Test
Run Code Online (Sandbox Code Playgroud)
但在model_b
我用
from ..main import Test
from ..db.database import Data
Run Code Online (Sandbox Code Playgroud)
我想检查哪个文件使用另一个文件,就像tree
命令一样,只需要一个文件夹名称就足够了,所以我尝试了一种旧方法,但它效率低下,很脏,这不是我所期望的。方法是我在src
named 中创建了一个文件check.py
,我导入了所有包
from app.db import database
from app.models import model_a, model_b
from app.tests import test_x, test_y
from app import …
Run Code Online (Sandbox Code Playgroud) python ×9
fastapi ×7
dictionary ×1
flask ×1
import ×1
list ×1
oauth-2.0 ×1
pickle ×1
pydantic ×1
python-3.x ×1
uvicorn ×1
validation ×1