Tôi đang sử dụng các mẫu Jinja2 với Bottle.py và dev_appserver của Google App Engine để phát triển. Tôi muốn các mẫu tự động tải lại trên mọi yêu cầu (hoặc lý tưởng chỉ khi chúng thay đổi), do đó tôi không phải tiếp tục khởi động lại máy chủ.Cách tốt nhất để vô hiệu hóa bộ đệm mẫu Jinja2 trong bottle.py là gì?
Theo tài liệu của chai, bạn có nghĩa vụ có thể vô hiệu hóa bộ nhớ cache mẫu bằng cách gọi bottle.debug(True)
.
Tuy nhiên, dường như Jinja vẫn đang lưu vào bộ nhớ cache mẫu của nó. Tôi tin rằng điều này là do cách các jinja2 chai adapter được viết (nó chỉ sử dụng một bộ nạp Jinja2 mặc định và không lộ nhiều tùy chọn cấu hình).
Tiếp theo Jinja2 Docs, tôi đã viết này Loader tùy chỉnh mà tôi mong chờ để kích hoạt một mẫu reload mọi thời gian, nhưng nó dường như không làm việc, hoặc:
import settings
from bottle import jinja2_template
from bottle import Jinja2Template, template as base_template
class AutoreloadJinja2Template(Jinja2Template):
def loader(self, name):
def uptodate():
# Always reload the template if we're in DEVMODE (a boolean flag)
return not settings.DEVMODE
fname = self.search(name, self.lookup)
if fname:
with open(fname, "rb") as f:
source = f.read().decode(self.encoding)
return (source, fname, uptodate)
template = functools.partial(base_template,
template_adapter=AutoreloadJinja2Template,
template_lookup = settings.TEMPLATE_PATHS,
template_settings={
'auto_reload': settings.DEVMODE
}
)
Templates vẫn bị lưu trữ cho đến khi tôi khởi động lại dev_appserver. Đây phải là một vấn đề khá phổ biến. Có ai có một giải pháp hoạt động?
UPDATE:
tôi đã kết thúc làm một cái gì đó như:
class CustomJinja2Template(Jinja2Template):
if settings.DEVMODE:
def prepare(self, *args, **kwargs):
kwargs.update({'cache_size':0})
return Jinja2Template.prepare(self, *args, **kwargs)
template = functools.partial(original_template, template_adapter=CustomJinja2Template)
Điều này làm cho các mẫu để luôn tải lại, nhưng chỉ khi một module trăn đã được chạm vào. tức là nếu bạn chỉ chỉnh sửa tệp mẫu, các thay đổi sẽ không có hiệu lực cho đến khi bạn chỉnh sửa một trong các tệp python nhập tệp đó. Dường như các mẫu vẫn đang được lưu trữ ở đâu đó.
Downarrowing vì đối số cache_size = 0 không hoạt động đối với tôi bằng cách sử dụng trình trang trí view() hoặc hàm template(). Cũng chạy (reloader = True) ném một lỗi: "local variable 'lockfile' được tham chiếu trước khi gán" – arkanciscan
@arkanciscan bug này có lẽ nó không liên quan đến responseq của tôi, nhưng nó vẫn ổn. Chỉ cần cho bạn biết, tôi báo cáo bình luận của bạn là một vấn đề để chai (https://github.com/defnull/bottle/issues/278). Bạn có thể cung cấp thêm chi tiết về lỗi trong github không? Bạn đang sử dụng bộ điều hợp máy chủ nào? Cảm ơn! – iurisilvio
+1 cho báo cáo lỗi, cảm ơn :) – defnull