cloudflare / cloudflare/python-workers-examples

D1 env access

未关闭
#5 1 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
主要语言
Python
星标
309
派生
69
平均合并
3 天 11 小时
30 天内合并 PR
13

描述

```
from fastapi import FastAPI, Request
from pydantic import BaseModel

from js import Response

async def on_fetch(request, env):
import asgi

# print("here", env)
return await asgi.fetch(app, request, env)

app = FastAPI()

@app.get("/")
async def root():
return {"message": "Hello, World!"}

@app.get("/env")
async def root(req: Request):
env = req.scope["env"]
return {
"message": "Here is an example of getting an environment variable: "
+ env.MESSAGE
}

class Item(BaseModel):
name: str
description: str | None = None
price: float
tax: float | None = None

@app.post("/items/")
async def create_item(item: Item):
return item

@app.put("/items/{item_id}")
async def create_item(item_id: int, item: Item, q: str | None = None):
result = {"item_id": item_id, **item.dict()}
if q:
result.update({"q": q})
return result

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

@app.get("/tablelist")
async def fetch_tables(req: Request):
env = req.scope["env"]

# Query D1 - we'll list all tables in our database in this example
results = await env.DB.prepare("PRAGMA table_list").all()
# Return a JSON response
return Response.json(results)

```

```toml
name = "hello-fastapi"
main = "src/worker.py"
compatibility_flags = ["python_workers"]
compatibility_date = "2023-12-18"

[vars]
MESSAGE = "This is an environment variable"

[[d1_databases]]
binding = "DB" # This will be how you refer to your database in your Worker
database_name = "jsonbase"
database_id = "69cf8448-d541-4bba-80ff-1264e73ccbde"
```

error
```
PythonError: Traceback (most recent call last):

File "/lib/python3.12/site-packages/fastapi/encoders.py", line 322, in jsonable_encoder
data = dict(obj)
^^^^^^^^^
TypeError: 'pyodide.ffi.JsProxy' object is not iterable

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/lib/python3.12/site-packages/fastapi/encoders.py", line 327, in jsonable_encoder
data = vars(obj)
^^^^^^^^^
TypeError: vars() argument must have __dict__ attribute

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "/session/metadata/worker.py", line 12, in on_fetch
return await asgi.fetch(app, request, env)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/lib/python3.12/site-packages/asgi.py", line 188, in fetch
result = await process_request(app, req, env)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/lib/python3.12/site-packages/asgi.py", line 130, in process_request
await app(request_to_scope(req, env), receive, send)
File "/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__
await super().__call__(scope, receive, send)
File "/lib/python3.12/site-packages/starlette/applications.py", line 123, in __call__
await self.middleware_stack(scope, receive, send)
File "/lib/python3.12/site-packages/starlette/middleware/errors.py", line 186, in __call__
raise exc
File "/lib/python3.12/site-packages/starlette/middleware/errors.py", line 164, in __call__
await self.app(scope, receive, _send)
File "/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__
await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
File "/lib/python3.12/site-packages/starlette/_exception_handler.py", line 64, in wrapped_app
raise exc
File "/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
await app(scope, receive, sender)
File "/lib/python3.12/site-packages/starlette/routing.py", line 758, in __call__
await self.middleware_stack(scope, receive, send)
File "/lib/python3.12/site-packages/starlette/routing.py", line 778, in app
await route.handle(scope, receive, send)
File "/lib/python3.12/site-packages/starlette/routing.py", line 299, in handle
await self.app(scope, receive, send)
File "/lib/python3.12/site-packages/starlette/routing.py", line 79, in app
await wrap_app_handling_exceptions(app, request)(scope, receive, send)
File "/lib/python3.12/site-packages/starlette/_exception_handler.py", line 64, in wrapped_app
raise exc
File "/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
await app(scope, receive, sender)
File "/lib/python3.12/site-packages/starlette/routing.py", line 74, in app
response = await func(request)
^^^^^^^^^^^^^^^^^^^
File "/lib/python3.12/site-packages/fastapi/routing.py", line 296, in app
content = await serialize_response(

X [ERROR] ^^^^^^^^^^^^^^^^^^^^^^^^^

File "/lib/python3.12/site-packages/fastapi/routing.py", line 180, in serialize_response
return jsonable_encoder(response_content)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/lib/python3.12/site-packages/fastapi/encoders.py", line 330, in jsonable_encoder
raise ValueError(errors) from e
ValueError: [TypeError("'pyodide.ffi.JsProxy' object is not iterable"), TypeError('vars() argument
must have __dict__ attribute')]

at new_error (pyodide-internal:generated/pyodide.asm:20:9998)
at [object Object]x16c818
at [object Object]x17437e
at _PyEM_TrampolineCall_JS (pyodide-internal:generated/pyodide.asm:20:120091)
at [object Object]x1bf539
at [object Object]x2c1c2d
at [object Object]x206dd5
at [object Object]x1bfc1b
at [object Object]x1bff2a
at [object Object]x1bffa8
at [object Object]x29a879
at [object Object]x2a0fde
```

贡献指南

打开贡献指南

评估

这个 Issue 还没有评估数据。

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。