Приложение Django на uWSGI / Nginx не перенаправляет после POST при использовании cache2 - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть зрелое приложение Django, использующее прокси Nginx и серверную часть uWSGI.Я пытаюсь перенести uWSGI для использования директивы cache2, и кеш, кажется, вызывает любые формы, которые перенаправляют после успешного POST, чтобы не перенаправлять - только для перезагрузки той же страницы.Когда я отключаю кеш (или использую сервер разработчика Django), POST проходит успешно и происходит перенаправление.Я не могу себе представить, что это предполагаемое поведение для cache2 - необходимость исключать любые страницы с POST из кэша - поэтому у меня где-то должна быть неправильная конфигурация.Этот же код (за исключением директивы cache2 ini) успешно работал с кешем старого стиля.Кроме того, из uwsgicachetop видно, что страница с вопросом успешно извлекается из кеша, поэтому сам кеш работает.Есть ли какая-либо другая конфигурация, которая должна быть добавлена ​​для успешной работы POST?

Конфигурация:

Django 1.9.13 на Python 3django-uwsgi-cache 1.0.1

Соответствующая конфигурация Nginx:

include                 uwsgi_params;
uwsgi_pass              unix:///opt/survey.sock;

Параметры uWSGI ini:

master = true
processes = 4
no-site = true
vhost = true
enable-threads = true
vacuum = true
die-on-term = true
reload-mercy = 8
harakiri = 30
max-requests = 5000

procname-prefix = mysite_

<b>;;; The new cache2 code section <a href="https://uwsgi-docs.readthedocs.io/en/latest/Caching.html" rel="nofollow noreferrer">(like uWSGI advises)</a></b>
cache2 = name=mycache,items=3000

; serve text/html of matched requests
route = .* cache:key=${REQUEST_URI},name=mycache

; store each successful request (200 http status code) 
; in the 'mycache' cache using the REQUEST_URI as key
route = .* cachestore:key=${REQUEST_URI},name=mycache
<b>;;; end of new code</b>

Настройки Django (как django-uwsgi-cache советует ):

CACHES = {
    'default': {
        'BACKEND': 'uwsgicache.UWSGICache',

        # and optionally, if you use a different cache name
        'LOCATION': 'mycache'
    }
}

Соответствующий шаблон выглядит так:

<form action='.' method='post' id='question_form'>{% csrf_token %}>
<input type='submit' value='Add to List' />
</form>

Подключено к представлению Django, которое выглядит следующим образом:

def choose_questions(request, slug, template_name='question.html', **kwargs):

    if request.method == 'POST':
        url = urlresolvers.reverse('survey_results')
        return HttpResponseRedirect(url)
    else:
        choosequestionform = ChooseQuestionForm(request=request, slug=slug)
    return render(request, template_name, locals())
...