gpt4 book ai didi

服务层的Python/Flask最佳实践

转载 作者:太空狗 更新时间:2023-10-29 17:42:51 27 4
gpt4 key购买 nike

我对 Python 有点陌生(我有 Java/C++ 背景)。我一直在使用 Flask 进行 Web 开发。我的问题在某种程度上与依赖注入(inject)和线程安全有关。在 Java/Spring 中,您将拥有一个 Controller ,该 Controller 具有一个服务,例如 UserService 注入(inject)其中。当您说出一个 addUser 端点时,它会调用 userService.addUser(someData)。

如果我想在 Python/Flask 中做同样的事情,最好的做法是只拥有一个名为 UserService 的文件,其中包含 addUser()、deleteUser() 等函数,然后直接用 UserService.addUser()、UserService 调用它们。 deleteUser() 这个线程安全吗?或者我应该在每个端点都有一个新的用户服务实例吗?

最佳答案

对于所有与线程相关的事物,问题是“您是否使其成为线程安全的”?

如果您的用户服务如下所示:

# user_service.py
from some.package import database

def add_user(user_information=None):
db = database.connect()
db.insert(user_information)

def update_user(user_information=None):
db = database.connect()
db.update(user_information["user_id"], user_information)

def delete_user(user_id=None):
db = database.connect()
db.delete(user_id)

然后,假设 some.package.database 的实现甚至远程理智,它将是线程安全的。另一方面,如果您执行以下操作:

# bad_user_service.py
from some.package import database

# Shared single connection
# Probably *not* thread safe
db = database.connect()

def add_user(user_information=None):
db.insert(user_information)

# ... etc. ...

现在,在每个服务方法的顶部包含 db = database.connect() 是非常不干的。您可以通过在装饰器中包装特定于连接的工作来避免该问题(例如):

def provide_db(func):

@functools.wraps(func)
def new_function(*args, **kwargs):
db = database.connect()
return func(db, *args, **kwargs)

return new_function

然后你可以这样做:

# user_service.py
from your.data.layer import provide_db

@provide_db
def add_user(db, user_information=None):
db.insert(user_information)

# ... etc. ...

关于服务层的Python/Flask最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16653421/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com