2013-12-18 14 views
5

Chúng tôi có bộ lọc Jinja tùy chỉnh mà chúng tôi sử dụng để tạo URL chặn truy xuất bộ nhớ cache cho tài nguyên Javascript và CSS của chúng tôi. Bây giờ chúng tôi nhận thấy rằng trong môi trường sản xuất của chúng tôi, các mẫu được biên dịch cuối cùng sẽ được lưu vào bộ nhớ cache. Điều này dẫn đến sự cố vì bộ lọc mẫu của chúng tôi đôi khi không tạo URL mới (tức là khi mẫu không được thay đổi nhưng Javascript là).Vô hiệu hoá bộ nhớ đệm mẫu Jinja cho bộ lọc nhất định

Có cách nào buộc Jinja phải đánh giá lại một bộ lọc nhất định mỗi lần và không lưu vào bộ nhớ cache kết quả không?

Chỉnh sửa 1: Chúng tôi đang sử dụng đầu vào không đổi (tên của tệp) vào bộ lọc.

Trả lời

2

Các bộ nhớ đệm vi của Jinja2 thể được cấu hình sử dụng cài đặt cache_size: http://jinja.pocoo.org/docs/api/#jinja2.Environment

Tuy nhiên, điều này chỉ lưu trữ các mẫu riêng của mình. Miễn là đầu vào cho một bộ lọc có thể thay đổi thì đầu ra cũng sẽ biến đổi.

Vậy ... bạn đang sử dụng bộ lọc như thế nào? Bạn có thể đăng một phần của mẫu và bộ lọc đang được lưu vào bộ đệm không?

+1

Vâng, chúng tôi đang sử dụng một giá trị đầu vào không đổi (tên của tập tin chúng tôi muốn cachebust). –

+0

Tôi có một bộ lọc tùy chỉnh được gọi là 'datetimeformat' định dạng datetime đã truyền. Tôi đã thêm một lối tắt vào nó, khi '' bây giờ '| datetimeformat' được sử dụng, nó sẽ đặt thời gian hiện tại. Và phát hiện ra rằng nó không thay đổi ... – warvariuc

+0

@warvariuc: nó sẽ phụ thuộc vào cách bạn nhận được ''now''. Nếu điều đó được xây dựng đúng cách, nó sẽ hoạt động nhưng thật dễ dàng để vô tình làm cho ngày tĩnh và do đó phá vỡ mọi thay đổi. – Wolph

3

Có một cách để vô hiệu hóa bộ nhớ đệm của kết quả của một bộ lọc cụ thể: nó bằng cách không sử dụng đầu vào không đổi, ví dụ: bằng cách hiển thị nguồn ngẫu nhiên làm biến toàn cầu.

# Expose to Jinja 
from random import random as RANDOM 

Và trong các mẫu

{{ RANDOM() | eval_this_filter_every_time }} 
5

Sau nhiều Googling, cuối cùng tôi đã tìm thấy các giải pháp thực tế cho việc này. Jinja có một trình trợ giúp đặc biệt được gọi là contextfilter mà bạn có thể sử dụng để trang trí chức năng của mình để làm cho bộ lọc của bạn nhận biết ngữ cảnh (và phụ thuộc vào ngữ cảnh). Bộ nhớ cache bytecode Jinja sẽ không lưu trữ giá trị được tính toán này, ngay cả khi một hằng số được truyền vào làm đầu vào.

Trong bộ lọc của bạn bằng Python:

from jinja2 import contextfilter 

@contextfilter 
def asset_url(context, url): 
    return some_url_thing(url) 

Trong mẫu của bạn:

<link rel="stylesheet" href="{{ 'styles.css' | asset_url }}" /> 
+0

Rất nhiều, rất nhiều, cảm ơn vì điều này! –

+0

Đây là câu trả lời đúng – b264

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