2013-05-20 32 views
6

Tôi là một chút mới với Python (tôi đến từ một nền Java/C++). Tôi đã chơi đùa với Flask để phát triển web. Câu hỏi của tôi liên quan phần nào để tiêm phụ thuộc và an toàn luồng. Trong từ Java/Spring bạn sẽ có một Controller có một Service nói rằng UserService được tiêm vào nó. Và khi bạn nói một điểm cuối addUser, nó sẽ gọi userService.addUser (someData).Python/Flask thực hành tốt nhất cho lớp dịch vụ

Nếu tôi muốn làm điều tương tự trong Python/Flask, cách tốt nhất là chỉ cần có một tệp gọi là UserService với các hàm như addUser(), deleteUser() vv và gọi thẳng với UserService.addUser(), UserService .deleteUser() và chuỗi này có an toàn không? Hoặc tôi nên có một trường hợp mới của dịch vụ người dùng trong mỗi điểm cuối?

+1

Không, sau [PEP8] (http://www.python.org/dev/peps/pep-0008/) nó nên được gọi là 'user_service' và các hàm phải là' add_user' và 'delete_user'. Python có quy ước riêng của mình để viết mã, không sử dụng tên kiểu Java, v.v. – Bakuriu

+0

ok cảm ơn, và là kiểu này chỉ cần gọi hàm trực tiếp cũ. user_servier.add_user() an toàn trong một phương thức điều khiển. – imrank1

Trả lời

13

Giống như tất cả những thứ liên quan đến chuỗi, câu hỏi đặt ra là "bạn đã làm cho chuỗi này an toàn" chưa?

Nếu dịch vụ người dùng của bạn trông như thế này:

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

Sau đó, giả sử một thực hiện thậm chí từ xa lành mạnh của some.package.database nó sẽ được đề an toàn. Nếu, mặt khác, bạn làm điều gì đó như thế này:

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

Bây giờ, bao gồm db = database.connect() ở phía trên cùng của mỗi phương pháp dịch vụ của bạn là rất un-DRY. Bạn có thể tránh vấn đề đó bằng cách gói lên công việc kết nối cụ thể của bạn trong một trang trí (ví dụ):

def provide_db(func): 

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

    return new_function 

Sau đó, bạn có thể làm điều này:

# 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

Cảm ơn đây chính xác là những gì tôi đang tìm kiếm – imrank1

Các vấn đề liên quan