Рендеринг полученных полезных данных Webhook с помощью Django просмотров - PullRequest
0 голосов
/ 07 января 2020

Платформа разработчика:

  • 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 %}

1 Ответ

0 голосов
/ 07 января 2020

Django представлений без состояний , означая, что каждый request, который вы получаете, ничего не знает о других объектах запроса. Объект request в my_webhook_view является совершенно другим объектом, чем объект request в webhook_renderer, и любые атрибуты, которые вы устанавливаете для одного, не будут доступны в другом.

Если вам нужен доступ к данным, полученным от вашего webhook, вам нужно будет сохранить данные в вашей базе данных или в кеше, или в обоих.

...