2013-05-20 9 views
6

Jestem trochę nowy w Pythonie (pochodzę z tła Java/C++). Bawiłem się z Flaskiem przy tworzeniu stron internetowych. Moje pytanie dotyczy nieco zależnego od iniekcji i bezpieczeństwa nici. W słowie Java/Spring miałbyś kontroler, który ma Usługę wstrzykniętą do niego UserService. A gdy powiesz punkt końcowy addUser, wywoła on userService.addUser (someData).Sprawdzone metody Python/Flask dla warstwy usługowej

Jeśli chcę zrobić to samo w Pythonie/Flasku, najlepiej jest po prostu mieć plik o nazwie UserService z funkcjami takimi jak addUser(), deleteUser() itd. I po prostu prosto wywoływać je za pomocą UserService.addUser(), UserService .deleteUser() i czy ten wątek jest bezpieczny? Czy powinienem mieć nowe wystąpienie usługi użytkownika w każdym punkcie końcowym?

+1

Nie, po [PEP8] (http://www.python.org/dev/peps/pep-0008/) powinno się nazywać 'user_service', a funkcje powinny być' add_user' i 'delete_user'. Python ma swoje własne konwencje na pisanie kodu, nie używa nazw w stylu Java itp. – Bakuriu

+0

ok dzięki, i jest to styl wywoływania funkcji bezpośrednio ex. user_servier.add_user() bezpieczny w metodzie sterownika. – imrank1

Odpowiedz

13

Podobnie jak w przypadku wszystkich wątków, pytanie brzmi "czy sprawiłeś, że wątki bezpieczne"?

Jeśli usługa użytkownik wygląda następująco:

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

Następnie, zakładając nawet zdalnie sane realizację some.package.database będzie bezpieczeństwo wątków. Jeśli, z drugiej strony, można zrobić coś takiego:

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

Teraz, w tym db = database.connect() w górnej części każdej z metod usługi jest bardzo un-DRY. Można uniknąć tego problemu przez podsumowującej pracę konkretnego połączenia w dekoratora (na przykład):

def provide_db(func): 

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

    return new_function 

Następnie można to zrobić:

# 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

Dzięki temu właśnie tego szukałem – imrank1

Powiązane problemy