Xin lỗi vì đã hỏi nhưng tôi đang sử dụng webapp2 và tôi đang thiết kế một giải pháp để giúp xác định tuyến đường dễ dàng hơn dựa trên chức năng định tuyến google webapp2 này .nhưng tất cả phụ thuộc vào khả năng xác định ở cấp độ trẻ em TYPE_NAME
. Ý tưởng là cha mẹ thiết lập mọi thứ và đứa trẻ chỉ cần thực hiện _danh sách
Chức năng. Vấn đề tôi đang gặp phải là TYPE_NAME
là Không có Tôi cần nó khi còn nhỏ.
#main WSGI được mở rộng để có chức năng này
lớp WSGIApplication(webapp2.WSGIApplication):
tuyến đường def (self, *args, **kwargs):
trình bao bọc def(func):
self.router.add(webapp2.Route(handler=func, *args, **kwargs))
return func
giấy gói trả lại
từ ứng dụng nhập khẩu chính
lớp ParentHandler(RequestHandler):
TYPE_NAME = Không có
@application.route('/', name="list_%s" %TYPE_NAME)
danh sách def (tự):
tự trả về._list()
lớp ChildHandler(ParentHandler):
TYPE_NAME = 'con'
def _list(tự):
trở lại []
Tôi đã thử một số giải pháp sử dụng "thuộc tính lớp" nhưng không thành công. Mở ra những ý tưởng khác, về cơ bản tôi chỉ cần lớp con kế thừa các thuộc tính trang trí và triển khai chúng.
biên tập:
Dành cho tất cả các bạn đang ngồi trên ghế thắc mắc làm cách nào để giải quyết vấn đề này, tôi không thể lấy được mọi thứ tôi cần từ người trang trí nên cuối cùng tôi đã sử dụng meta. Tôi cũng đã thêm một _URLS
Các tham số để cho phép thêm các "tuyến đường" bổ sung. nó sẽ custom
Chức năng ánh xạ tới các tuyến đường. Thực sự muốn sử dụng công cụ trang trí nhưng không thể làm cho nó hoạt động được.
lớp Yêu cầuURLMeta(loại):
def __new__(mcs, tên, căn cứ, dct):
result = super(RequestURLMeta, mcs).__new__(mcs, name, base, dct)
urls = getattr(kết quả, '_URLS', {}) hoặc {}
cho k,v trong urls.iteritems():
mẫu = v.pop('mẫu')
app.route(getattr(kết quả, k), mẫu, **v)
nếu getattr(kết quả, 'TYPE_NAME', Không có):
app.route(result.list, result.ROOT_PATH, Method=['GET'],name="%s" % result.TYPE_NAME)
#những người khác đã đến đây..
kết quả trả về
lớp ParentHandler(RequestHandler):
__metaclass__ = Yêu cầuURLMeta
lớp ChildHandler(ParentHandler):
TYPE_NAME = 'con'
_URLS = { 'tùy chỉnh': '/custom', 'TYPE_NAME': 'custom_test' }
def _list(tự):
trở lại []
def tùy chỉnh (tự): vượt qua
Tôi nghĩ để làm cho nó hoạt động bạn cần sử dụng siêu lớp .Nó có thể trông giống như sau (chưa được kiểm tra):
từ ứng dụng nhập khẩu chính
lớp RouteMeta(loại):
def __new__(mcs, tên, căn cứ, dct):
type_name = dct.get("TYPE_NAME")
nếu type_name không phải là Không có:
@application.route('/', type_name)
danh sách def (tự):
tự trả về._list()
dct["danh sách"] = danh sách
return super(RouteMeta, mcs).__new__(mcs, name, base, dct)
lớp ParentHandler(RequestHandler):
__metaclass__ = RouteMeta
lớp ChildHandler(ParentHandler):
TYPE_NAME = 'con'
def _list(tự):
trở lại []
danh sách()
Phương pháp này không Trình xử lý cha mẹ
thuộc tính nhưng được kế thừa từ Trình xử lý cha mẹ
Lớp được tạo động và có TYPE_NAME
Đã xác định.
nếu như Trình xử lý yêu cầu
Đồng thời sử dụng siêu dữ liệu tùy chỉnh, hãy RouteMeta
继承自 Yêu cầuHandler.__metaclass__
thay vì kiểu
.
Tôi là một lập trình viên xuất sắc, rất giỏi!