Tôi đang cố sử dụng các trình trang trí để quản lý cách người dùng có thể hoặc không thể truy cập tài nguyên trong ứng dụng web (chạy trên Google App Engine). Xin lưu ý rằng tôi không cho phép người dùng đăng nhập bằng tài khoản Google của họ, do đó, việc đặt quyền truy cập cụ thể cho các tuyến đường cụ thể trong app.yaml không phải là một tùy chọn.Trình trang trí Python và kế thừa lớp
tôi đã sử dụng các nguồn sau:
- Bruce Eckel's guide to decorators
- SO : get-class-in-python-decorator2
- SO : python-decorators-and-inheritance
- SO : get-class-in-python-decorator
Tuy nhiên tôi vẫn còn một chút bối rối ...
Dưới đây là mã của tôi! Trong ví dụ sau, current_user là một phương thức @property thuộc về lớp RequestHandler. Nó trả về một đối tượng User (db.model) được lưu trữ trong kho dữ liệu, với một mức IntProperty().
class FoobarController(RequestHandler):
# Access decorator
def requiredLevel(required_level):
def wrap(func):
def f(self, *args):
if self.current_user.level >= required_level:
func(self, *args)
else:
raise Exception('Insufficient level to access this resource')
return f
return wrap
@requiredLevel(100)
def get(self, someparameters):
#do stuff here...
@requiredLevel(200)
def post(self):
#do something else here...
Tuy nhiên, ứng dụng của tôi sử dụng các bộ điều khiển khác nhau cho các loại tài nguyên khác nhau. Để sử dụng các trang trí @requiredLevel trong tất cả các lớp con, tôi cần phải di chuyển nó vào lớp cha (RequestHandler):
class RequestHandler(webapp.RequestHandler):
#Access decorator
def requiredLevel(required_level):
#See code above
Ý tưởng của tôi là để truy cập vào trang trí trong tất cả các lớp con điều khiển bằng cách sử dụng đoạn mã sau:
class FoobarController(RequestHandler):
@RequestHandler.requiredLevel(100)
def get(self):
#do stuff here...
Tôi nghĩ mình đã đạt đến giới hạn kiến thức về trang trí và thừa kế lớp :). Có suy nghĩ gì không?
Tại sao nó là một phương pháp trên lớp học? Điều đó sẽ chỉ gây ra mọi thứ để phá vỡ, và nó sẽ chỉ hoạt động như một hàm bình thường bên trong lớp mà nó đã được định nghĩa. Trừ khi bạn đang ở trên 3.x, trong trường hợp đó nó có thể hoạt động tốt. –
Trình trang trí là một phương thức trên lớp vì tôi chưa tìm cách viết mã trang trí là lớp 1/chấp nhận đối số và 2/có thể truy cập các phương thức vào chính lớp hiện tại. Đây có phải là ý của bạn không? Chủ yếu là tự học, tôi gặp khó khăn hoàn toàn hiểu được hướng dẫn, trang trí và thừa kế của Bruce Eckell. – jbmusso
Bạn chỉ có thể sao chép-dán chức năng bên ngoài lớp, và nó sẽ hoạt động tốt và bình thường. Điều đó có đủ để trả lời câu hỏi của bạn không? –