cache_page
decorator là người trang trí django, không phải người trang trí django-redis. Vì vậy, nếu bạn đang sử dụng bộ nhớ đệm mặc định như memcached trong django, bộ trang trí cache_page sẽ tạo các khóa tương tự trong memcached. Đây là mã cơ sở của bộ trang trí dọc theo chuỗi doc:
https://github.com/django/django/blob/711123e1cdaf3b08c876c045d8d38decdc7a63d3/django/views/decorators/cache.py#L8
"" "Trình trang trí cho các dạng xem cố gắng lấy trang từ bộ nhớ cache và phổ biến bộ nhớ cache nếu trang chưa có trong bộ nhớ cache. Bộ nhớ cache được khóa bởi URL và một số dữ liệu từ các tiêu đề. Ngoài ra, có tiền tố khóa đó là được sử dụng để phân biệt các vùng cache khác nhau trong thiết lập nhiều trang web. Ví dụ:bạn có thể sử dụng tên miền theget_current_site (). vì tên miền đó là duy nhất trên một Djangoproject. Ngoài ra, tất cả các tiêu đề từ tiêu đề Vary của phản hồi sẽ được tính vào bộ nhớ đệm - chỉ giống như phần mềm trung gian. "" "
Vì vậy, vốn dĩ nó đang tạo nhiều khóa, một khóa cho tiêu đề và khóa khác cho nội dung HTTPResponse. Nó tạo các khóa dựa trên tiêu đề và nội dung, do đó bất kỳ thay đổi nào trong tiêu đề sẽ làm mất hiệu lực bộ đệm (ví dụ:trong trường hợp các tiêu đề khác nhau), tức là ngay cả với cùng một tham số trong url, nhưng nội dung khác nhau trong tiêu đề yêu cầu, bạn sẽ có bộ đệm riêng . Ví dụ về các tiêu đề yêu cầu khác nhau có thể gửi thông tin đăng nhập về cùng một trang cho những người dùng đã đăng nhập khác nhau hoặc cung cấp nội dung khác nhau cho cùng một url dựa trên thông tin tác nhân người dùng trên thiết bị di động / máy tính để bàn có trong tiêu đề. Đây là mã khóa bộ nhớ cache trong django:
def _generate_cache_key(request, method, headerlist, key_prefix):
"""Return a cache key from the headers given in the header list."""
ctx = hashlib.md5()
for header in headerlist:
value = request.META.get(header)
if value is not None:
ctx.update(force_bytes(value))
url = hashlib.md5(force_bytes(iri_to_uri(request.build_absolute_uri())))
cache_key = 'views.decorators.cache.cache_page.%s.%s.%s.%s' % (
key_prefix, method, url.hexdigest(), ctx.hexdigest())
return _i18n_cache_key_suffix(request, cache_key)
def _generate_cache_header_key(key_prefix, request):
"""Return a cache key for the header cache."""
url = hashlib.md5(force_bytes(iri_to_uri(request.build_absolute_uri())))
cache_key = 'views.decorators.cache.cache_header.%s.%s' % (
key_prefix, url.hexdigest())
return _i18n_cache_key_suffix(request, cache_key)
def get_cache_key(request, key_prefix=None, method='GET', cache=None):
"""
Return a cache key based on the request URL and query. It can be used
in the request phase because it pulls the list of headers to take into
account from the global URL registry and uses those to build a cache key
to check against.
If there isn't a headerlist stored, return None, indicating that the page
needs to be rebuilt.
"""
if key_prefix is None:
key_prefix = settings.CACHE_MIDDLEWARE_KEY_PREFIX
cache_key = _generate_cache_header_key(key_prefix, request)
if cache is None:
cache = caches[settings.CACHE_MIDDLEWARE_ALIAS]
headerlist = cache.get(cache_key)
if headerlist is not None:
return _generate_cache_key(request, method, headerlist, key_prefix)
else:
return None