2013-05-20 118 views
6

我对Python有点新(我来自Java/C++背景)。我一直在使用Flask进行Web开发。我的问题在某种程度上与依赖注入和线程安全有关。在Java/Spring这个词中,你会有一个控制器,它有一个服务,注入UserService。当你说addUser端点时,它会调用userService.addUser(someData)。服务层的Python/Flask最佳实践

如果我想在Python/Flask中做同样的事情,最好的做法是使用像addUser(),deleteUser()等函数创建一个名为UserService的文件,并直接使用UserService.addUser(),UserService .deleteUser()并且这个线程安全吗?或者我应该在每个端点中有一个用户服务的新实例?

+1

号,以下[PEP8(HTTP:/你可以在(例如)装饰包裹你的连接特定的工作,避免问题/www.python.org/dev/peps/pep-0008/),它应该被称为'user_service',函数应该是'add_user'和'delete_user'。 Python有它自己的编写代码的惯例,不要使用Java风格的名字等。 – Bakuriu

+0

好的谢谢,并且这种风格只是直接调用函数ex。 user_servier.add_user()在控制器方法中是安全的。 – imrank1

回答

13

与所有线程相关的问题一样,问题是“你是否让线程安全”?

如果您的用户服务是这样的:

# 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. ... 
+0

感谢这正是我正在寻找 – imrank1