2009-08-14 22 views
7

Đây là một câu hỏi rất tương tự như sau thread SO trên middleware and views communicatingmiddleware vs xử lý bối cảnh để xem phụ thuộc navigation/hiển thị

Chúng tôi muốn có mẫu của chúng tôi được đưa ra một bộ tiêu chuẩn của các biến bối cảnh. Vì vậy, một bộ xử lý ngữ cảnh có vẻ thích hợp, tuy nhiên, nó không có vẻ như bộ xử lý ngữ cảnh là nhận thức. Trước đây chúng tôi đã buộc phải kiểm tra ngăn xếp cuộc gọi để nhận thông tin theo ngữ cảnh về những gì chế độ xem đang làm gì.

Đó là nơi chúng tôi đã xem chuỗi trung gian cũng như chữ ký process_view() cho phần mềm trung gian cho phép chúng tôi xử lý chế độ xem.

Điều này dường như gần hơn với nhu cầu của chúng tôi, nhưng không cho phép chúng tôi sửa đổi biến ngữ cảnh, cũng như các phương pháp phần mềm trung gian khác.

Vì vậy, ý tưởng thân mật của chúng tôi là sửa đổi đối tượng yêu cầu với tất cả thông tin chung và ngữ cảnh mà chúng tôi cần cho mẫu của chúng tôi và buộc mẫu gọi từ {{request.something}} để biết thông tin cụ thể mà chúng tôi cần, chẳng hạn như {{request.viewname}}.

Vì vậy, câu hỏi của chúng tôi:

  • Được sửa đổi/thiết lập các giá trị theo yêu cầu đối tượng là một điều được chấp nhận để làm cho đẩy theo ngữ cảnh/toàn cầu thông tin ứng dụng cụ thể để mẫu của bạn? Hoặc là thực hành tiêu chuẩn luôn luôn đặt nó vào bối cảnh?
  • Có cách nào/thủ thuật để làm cho bộ xử lý ngữ cảnh xem nhận thức được rằng không liên quan đến việc chuyển nó một cách rõ ràng hoặc làm một số vấn đề nội tâm không?
  • Liệu middleware.process_response có cơ hội sửa đổi ngữ cảnh hay không thay đổi?

Trả lời

4

Hoàn toàn hợp lệ để đặt biến trên yêu cầu trong phần mềm trung gian - Tôi luôn làm như vậy.

Không có cách nào để sử dụng process_response cho điều này, như lúc đó mẫu đã được hiển thị - tại thời điểm này, tất cả những gì bạn nhận được là HttpResponse chứa một loạt HTML.

Một cách khác có thể là bọc render_to_response với chức năng của riêng bạn, trong đó có ngữ cảnh, cùng với yêu cầu và mẫu, và sửa đổi nó khi cần thiết trước khi giao cho hàm render thực tế. Điều này có lợi thế của việc sửa đổi bối cảnh thực tế, nhưng bất lợi mà bạn phải thực sự nhớ để gọi nó trong mỗi lần xem thay vì hàm mặc định.

+0

Xem thêm http://jboxer.com/2009/05/django-middleware-vs-context-processors/ – Ztyx

2

Bạn có thể làm điều đó bằng cách sử dụng phần mềm trung gian và bộ xử lý ngữ cảnh song song. Phần mềm trung gian biết về khung nhìn và có thể đặt thuộc tính theo yêu cầu. Sau đó, bộ xử lý ngữ cảnh có thể di chuyển bất cứ thứ gì được đặt trên yêu cầu vào ngữ cảnh.

Ví dụ:

class ExtraContextMiddleware(object): 
    """ 
    Adds extra context to the response for certain views. 

    Works in tandem with the extra_context context processor. 
    """ 

    context_map = { 
     #Adds the supplied context dict to the named views 
     'my_view_name': {'foo': 'Hello', 'bar': 'Goodbye'}, 
    } 

    def process_view(self, request, view, *args, **kwargs): 
     try: 
      request.extra_context = self.context_map[view.func_name] 
     except KeyError: 
      pass 

Sau đó, bộ vi xử lý ngữ cảnh:

def extra_context(request): 
    """Context processor for adding extra context. 
    Works in tandem with ExtraContextMiddleware.""" 
    try: 
     return request.extra_context 
    except AttributeError: 
     return {} 
Các vấn đề liên quan