Платформа разработчика:
- Python 3.6.2
- Django 3.0
- Windows 10 VScode
Проблема:
Я не могу обработать полученную полезную нагрузку webhook в шаблоне django с помощью того же метода представления или перенаправления. Также я не могу использовать переменную django сеансов для передачи данных полезной нагрузки в другое представление. Похоже, что сеанс не существует в соответствии с инструкциями печати. Похоже, я упускаю что-то крутое.
Подробности: settings.py Параметры промежуточного программного обеспечения и установленное приложение для моих сессий также правильно настроены для сеансов на основе повара ie.
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
# 'whitenoise.middleware.WhiteNoiseMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'
Я настроил свой URL-адрес webhook на mailchimp после того, как выставил свой локальный dev-сервер с помощью ngrok. Например,
34nghirt345.ngrok.io / webhook
, а также в моей конфигурации URL следующим образом:
urls.py
path('webhook/', views.my_webhook_view),
path('webhook/<str:some_id>/', views.webhook_renderer, name ="url_webhook_renderer"),
Я получаю полезную нагрузку webhook от mailchimp по настроенному пути URL-адреса и могу обработать полезную нагрузку в рамках соответствующего метода представления.
views.py
@csrf_exempt
def my_webhook_view(request):
# Mailchimp webhook receiver for mailchimp batch operations.
context = {}
if request.method == 'POST':
print('Webhook Payload Received')
logger.debug(f"Some ID: {request.POST.get('data[id]')}")
payload_dict = {k:v for k,v in request.POST.items()}
logger.debug(f"Dict of POST DATA: {payload_dict}")
context = {
'some_id': payload_dict['data[id]']
}
print("Webhook Post session items Before: ",request.session.items())
request.session["context"] = context
request.session.modified = True
# I have also used SESSION_SAVE_EVERY_REQUEST = True as well but that didn't work either.
print("Webhook Post session items After: ",request.session.items())
#return render(request, "webhooks/webhook_rendering.html", context = context)
return redirect('url_webhook_renderer', batch_id = context['some_id'])
def webhook_renderer(request, batch_id):
print("Webhook rendering session passed context:",request.session.get('context'))
print("Webhook rendering session items:",request.session.items())
context = request.session.get('context')
return render(request, "webhooks/webhook_rendering.html", context = context)
Вывод на консоль:
Печатает операторы формы my_webhook_view
Webhook Публиковать элементы сеанса Перед: dict_items ([]) Webhook Опубликовать
элементы сеанса После: dict_items ([('context', {'batch_id': 'some_id'})])
Печать операторов из webhook_renderer
Переданный контекст сеанса рендеринга Webhook: отсутствует
Элементы сеанса рендеринга Webhook: dict_items ([])
webhook_rendering. html
{% extends "index.html" %}
{% block content %}
<p> {{ some_id }} </p>
{% endblock content %}