2013-05-20 18 views
6

私はPythonに少し新しくなりました(私はJava/C++バックグラウンドから来ています)。私はWeb開発のためにFlaskで遊んでいました。私の質問は、依存する注入とスレッドの安全性にある程度関係します。 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

okありがとう、この関数は直接関数を呼び出すだけです。 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のも、リモートでまともな実装を想定しました。一方、あなたはこのような何かをした場合:あなたのサービス・メソッドのそれぞれの上部にdb = database.connect()含め今

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

は、非常に非DRYです。

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

関連する問題