FastAPI 中的会话

Posted

技术标签:

【中文标题】FastAPI 中的会话【英文标题】:Session in FastAPI 【发布时间】:2021-09-06 23:49:29 【问题描述】:

我想用 FastAPI 和 Jinja 作为模板构建一个购物车 所以我需要在会话中为每个匿名用户保存数据。 Django 和flask 有一个内置的会话功能,我们可以很容易地做到这一点。 一种解决方案可以使用 SQLAlchemy 会话,但 SQLAlchemy 会话不支持匿名用户,我们必须为每个会话单独创建令牌。那么我们应该使用存储的令牌保存每个数据。 有没有其他类似 Django 和 Flask 的内置函数的方式?

【问题讨论】:

您想在哪里存储匿名用户的数据?在您的数据库中,还是在 cookie 中? 我想将它存储在数据库中。我更喜欢将它存储在一些缓存的数据库中,例如 redis。 您有什么简单的方法可以将匿名用户存储在 cookie 中吗? 【参考方案1】:

首先,我们应该在购物车应用程序中创建购物车文件,然后使用我们想要的功能构建购物车类。

secret_key='cart'

class Cart(object):

    def __init__(self, request,db):

        self.session = request.session
        cart = self.session.get(secret_key)

        if not cart:
            # save an empty cart in the session
            cart = self.session[secret_key] = 

        self.cart = cart

    def add(self, product, quantity=1, update_quantity=False):

        product_id = str(product.id)
        if product_id not in self.cart:
            self.cart[product_id] = 'quantity': 0,
                                 'price': str(product.price)
                                 
        if update_quantity:
            self.cart[product_id]['quantity'] = quantity
        else:
            self.cart[product_id]['quantity'] += quantity

那么我们应该创建 cart_add API:

@app.post("/add")
def cart_add(request: Request,db: Session = Depends(get_db), id: int=Form(...), quantity: int=Form(...),
         update:bool=Form(...)):
    cart=Cart(request,db)
    product=db.query(models.Product).filter(models.Product.id == id).first()
    cart.add(product=product, quantity=quantity, update_quantity=update)
    return RedirectResponse(url="/cart", status_code=status.HTTP_303_SEE_OTHER)

就是这样。我们通过 fastapi.Request.session 内置函数在会话中保存匿名用户的购物车,并将我们的数据保存在 cookie 中。

【讨论】:

以上是关于FastAPI 中的会话的主要内容,如果未能解决你的问题,请参考以下文章

FastAPI:如何访问依赖项中的 APIRoute 对象

单独文件中的 FastAPI / Pydantic 循环引用

FastAPI小项目实战:电影列表(Vue3 + FastAPI)

docker中的Nginx,fastapi和streamlit - 反向代理不适用于streamlit

在 docker (FastAPI) 中使用 Wea​​syPrint 导出的 PDF 中的字体

22.FastAPI开发大型应用