У меня есть представление, и я его кэшировал в views.py с использованием django-cacheops (https://github.com/Suor/django-cacheops):
@cached_view(timeout=60*15)
@csrf_exempt
def order(request, usr):
...
Регулярное выражение для просмотра заказа в urls.py:
url(r'^order/(?P<usr>\D+)$', views.order, name='ord')
# Example Url: http://127.0.0.1:8000/order/demo (demo is the user name)
И я хочу аннулировать кэшированное представление order
внутри представленного ниже представления:
@login_required
def available(request, pk, avail):
pk = int(pk)
avail = strtobool(avail)
if avail:
Product.objects.filter(id = pk).update(available = True)
else:
Product.objects.filter(id = pk).update(available = False)
return HttpResponseRedirect(reverse_lazy('yc'))
Согласно документам, мы можем добиться этого, выполнив:
@login_required
def available(request, pk, avail):
pk = int(pk)
avail = strtobool(avail)
if avail:
Product.objects.filter(id = pk).update(available = True)
order.invalidate("http://127.0.0.1:8000/order/demo", "demo")
#it's a dummy url I've handled it dynamically in my code
else:
Product.objects.filter(id = pk).update(available = False)
order.invalidate("http://127.0.0.1:8000/order/demo", "demo")
#it's a dummy url I've handled it dynamically in my code
return HttpResponseRedirect(reverse_lazy('yc'))
Но это не работает.
Вот мои журналы с использованием redis-cli monitor
:
1647434341.849096 [1 [::1]:59650] "GET" "c:af687d461ec8bb3c48f6392010e54778"
1647434341.866966 [1 [::1]:59650] "SETEX" "c:af687d461ec8bb3c48f6392010e54778" "900" "\x80\x04\x95\xfa\b\x00\x00\x00\x00\x00\x00\x8c\x14django.http.response\x94\x8c\x0cHttpResponse\x94\x93\x94)\x81\x94}\x94(\x8c\b_headers\x94}\x94\x8c\x0ccontent-type\x94\x8c\x0cContent-Type\x94\x8c\x18text/html; charset=utf-8\x94\x86\x94s\x8c\x11_closable_objects\x94]\x94\x8c\x0e_handler_class\x94N\x8c\acookies\x94\x8c\x0chttp.cookies\x94\x8c\x0cSimpleCookie\x94\x93\x94)\x81\x94\x8c\x06closed\x94\x89\x8c\x0e_reason_phrase\x94N\x8c\b_charset\x94N\x8c\n_container\x94]\x94B\xed\a\x00\x00<!DOCTYPE html>\n\n<html>\n <head>\n <meta charset=\"utf-8\">\n <title>Buy Products</title>\n <link href=\"https://fonts.googleapis.com/css?family=Peralta\" rel=\"stylesheet\">\n <link rel=\"stylesheet\" href=\"/static/css/bootstrap.min.css\">\n <link rel=\"stylesheet\" href=\"/static/css/app.css\">\n </head>\n <body>\n <div class=\"wrapper\">\n <div class=\"container\">\n <ol class=\"breadcrumb my-4\">\n <li class=\"breadcrumb-item active\" style=\"color: #000;\">Buy Products</li>\n </ol>\n <form method=\"post\">\n <!-- <input type=\"hidden\" name=\"csrfmiddlewaretoken\" value=\"SnsBnyPIwIDejqctR7TMNkITcSafgwiydwsyIiAKQkiSvr3nFA0cm1Tf3Mk6JTPj\"> -->\n <p><label for=\"id_name\">Name:</label> <select name=\"name\" id=\"id_name\">\n <option value=\"Redmi note 5\">Product Name: Redmi note 5 \n MRP: 100000 \n Discounted Price: 45678 \n Description: It's good phone too</option>\n\n <option value=\"xiomi 2\">Product Name: xiomi 2 \n MRP: 10000 \n Discounted Price: 200 \n Description: xyz</option>\n\n <option value=\"mouse\">Product Name: mouse \n MRP: 1400 \n Discounted Price: 200 \n Description: xyzat</option>\n\n</select></p>\n<p><label for=\"id_user_name\">User name:</label> <textarea name=\"user_name\" cols=\"40\" rows=\"1\" maxlength=\"30\" required id=\"id_user_name\">\n</textarea></p>\n<p><label for=\"id_adress\">Adress:</label> <textarea name=\"adress\" cols=\"40\" rows=\"2\" maxlength=\"4000\" required id=\"id_adress\">\n</textarea></p>\n<p><label for=\"id_mobile\">Mobile:</label> <textarea name=\"mobile\" cols=\"40\" rows=\"1\" maxlength=\"10\" required id=\"id_mobile\">\n</textarea></p>\n<p><label for=\"id_qty\">Qty:</label> <input type=\"number\" name=\"qty\" required id=\"id_qty\"></p>\n <button type=\"submit\" class=\"btn btn-success\">Buy</button>\n </form>\n </div>\n <div class=\"push\"></div>\n </div>\n <script src=\"/static/js/jquery-3.2.1.min.js\"></script>\n <script src=\"/static/js/popper.min.js\"></script>\n <script src=\"/static/js/bootstrap.min.js\"></script>\n </body>\n</html>\n\x94aub."
1647434354.133804 [1 [::1]:59650] "DEL" "c:94c7a9e7f6c7a45ee645caa02f53d000"
Похоже, он удаляет какой-то другой кеш.
Я также поднял этот вопрос в репозитории django-cache
, вы можете проверить его для получения дополнительной информации: https://github.com/Suor/django-cacheops/issues/425
Поскольку вы использовали именованную группу usr
в своем регулярном выражении, Django передает ее как аргумент ключевого слова:
url(r'^order/(?P<usr>\D+)$', views.order, name='ord')
Но вы пытаетесь сделать кеш недействительным с помощью позиционного аргумента:
order.invalidate("http://127.0.0.1:8000/order/demo", "demo")
Вместо этого аннулируйте его с помощью соответствующего аргумента ключевого слова:
order.invalidate("http://127.0.0.1:8000/order/demo", usr = "demo")