2015-09-28 17 views
6

Cách tiếp cận đúng để sử dụng trình xử lý dựa trên lớp học thay vì các chức năng trong thư viện aiohttp là gì? Tôi đã từng viết các trình xử lý như các lớp trong Django vì vậy tôi tự hỏi làm thế nào để làm điều đó một cách chính xác trong aiohttp?Chế độ xem dựa trên lớp học trong aiohttp

Trả lời

5

Tôi giả sử bạn muốn sử dụng trình xử lý dựa trên lớp vì lợi ích của việc áp dụng thừa kế để sử dụng lại mã.

Trình xử lý web aiohttp về mặt kỹ thuật là bất kỳ coroutine nào chấp nhận tham số yêu cầu và trả về cá thể phản hồi.

Ví dụ

class BaseView: 
    def __init__(self, ...): 
     ... 

    @asyncio.coroutine 
    def __call__(self, request): 
     return web.Response() 

app.router.add_route('GET', '/', BaseView(...)) 

có thể được sử dụng như là lớp cơ sở cho việc thực hiện web xử lý hệ thống cấp bậc.

Hoặc thậm chí

class Handler: 
    def __init__(self, db): 
     self._db = db 

    @asyncio.coroutine 
    def get_from_db(self, data): 
     ... 

    @asyncio.coroutine 
    def handle_a(self, request): 
     data = yield from self.get_from_db(
      self.extract_from_request_a(request)) 
     return web.Response(self.format_data(data)) 

    @asyncio.coroutine 
    def handle_b(self, request): 
     data = yield from self.get_from_db(
      self.extract_from_request_b(request)) 
     return web.Response(self.format_data(data)) 


handler = Handler(db) 
app.router.add_route('GET', '/a', hadndler.handle_a) 
app.router.add_route('GET', '/b', hadndler.handle_b) 
+2

Vẫn không có ý tưởng làm thế nào để thêm bài function (theo yêu cầu) ví dụ. Tôi có nên thực hiện phương thức as_view() để sử dụng trong các url không. – vwvolodya

+0

Tôi đã thêm ví dụ để đăng ký một cá thể. Mã không tạo lại BaseView cho mọi yêu cầu - Tôi thấy rằng không bắt buộc thường chúng ta sử dụng cách tiếp cận với lớp 'Xử lý' rất tốt. –

+1

Cập nhật: Phiên bản gần đây đã thêm [Chế độ xem dựa trên lớp] (https://aiohttp.readthedocs.org/en/stable/web.html#class-based-views). Lưu ý rằng có những biến chứng với điều này, không phải tất cả 'aio-libs' đều hỗ trợ nó hoàn toàn – nerdwaller

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