Как создать представление для случайного URL?

#django

#django

Вопрос:

Я нахожусь в процессе приема платежей на своем сайте, и я решил использовать Stripe. Способ, которым это работает, заключается в том, что когда платеж завершен или отменен, он перенаправляется на страницу в зависимости от того, что произошло. Как я могу создать представление, которое проверяет параметр GET моего случайно сгенерированного URL, чтобы я мог выполнять свой код?

 payment = stripe.checkout.Session.create(
  success_url="https://myurl.com/dashboard/payment/accepted/?id=MyvariableID",
  cancel_url="https://myurl.com/dashboard/payment/declined",
  payment_method_types=["card"],
  client_reference_id= stripeUID,
  line_items=[
    {
      "amount": 2000242,
      "quantity": 1,
      "name": "Blender rendering",
      "currency": "usd",
    }
  ]
)   
  

Итак, предположим, что платеж пользователя подтвержден, и он перенаправлен на success_url="https://myurl.com/dashboard/payment/accepted/?id=MyvariableID",
Как я могу создать динамическое представление, которое проверяет идентификатор параметра GET, чтобы я мог запрашивать некоторые данные базы данных?

Если есть лучший способ сделать это, не стесняйтесь, дайте мне знать. Любая помощь приветствуется.

Комментарии:

1. Вы можете получить id из request.GET dict в представлении.

2. Но в остальном параметр «random» ничем не отличается от любого другого параметра URL.

3. @Alasdair Извините за ошибку с моей стороны ?id . Но как бы мне сообщить django, что это представление предназначено для этого случайного URL? Вот в чем я не уверен.

4. Похоже, вам нужно добавить шаблон URL, например path('/dashboard/payment/accepted/', payment_accepted, name='payment_accepted'), — строка запроса не включена.

5. @Alasdair Должен ли я затем создать представление, которое выглядит примерно так def payment_accepted(request, payment_accepted): , А затем мой код в разделе для захвата GET?

Ответ №1:

ИДЕНТИФИКАТОР как получаемый параметр

В приведенном выше примере ваш URL всегда, https://myurl.com/dashboard/payment/accepted/ поскольку ?id=MyvariableID это всего лишь параметр GET.

Просто создайте простой URL-путь, что-то вроде этого:

 from yourapp import views

path('dashboard/payment/accepted/', views.accepted, name='accepted')
  

В вашем представлении вы можете получить доступ к параметру через request.GET . Например:

 def accepted(request):
    payment_id = request.GET.get('id')

    if payment_id is not None:
        # do something
    else:
        # no payment ID found
  

Это вернет, None если id не найдено, поэтому вам нужно выполнить управление исключениями вручную. Вы также можете использовать это:

 def accepted(request):
    try:
        payment_id = request.GET['id']
        # verify payment ID
    except KeyError:
        # no payment ID found
  

Идентификатор как часть URL

Если вы хотите, чтобы идентификатор был частью URL, тогда все выглядит немного по-другому. Прежде всего, ваша конфигурация URL выглядит примерно так:

 from yourapp import views

path('dashboard/payment/accepted/<payment_id>/', views.accepted, name='accepted')
  

Ваше представление получает payment_id из URL в качестве аргумента:

 def accepted(request, payment_id):
    # verify payment ID
  

Кстати. вы, вероятно, захотите изменить <payment_id> in path на <int:payment_id> , если вы ожидаете int . Или вы можете использовать re_path и даже выполнить проверку регулярного выражения для лучшего соответствия.

Комментарии:

1. Это отвечает на то, о чем я был смущен. Спасибо. У меня есть одна проблема, и это при посещении URL-адреса он не находит путь. The current path, dashboard/payment/accepted/64ab15e8-bc83-4281-beda-9c90ab4edcaa, didn't match any of these . Я добавил ваш urls.py и views.py

2. Вы включили свой urls.py в конфигурацию корневого URL или отредактировали его напрямую? Если вы работаете в режиме отладки и получаете 404, вы должны увидеть все доступные URL прямо над вашим сообщением об ошибке The current path, dashboard/payment/accepted/64ab15e8-bc83-4281-beda-9c90ab4edcaa, didn't match any of these .

3. Ваш settings модуль, скорее всего, будет иметь ROOT_URLCONF переменную, которая указывает на конфигурацию корневого URL. Либо добавьте свой URL path() в эту конфигурацию, либо создайте свой собственный urls.py и включите его в корневую конфигурацию, как в этом примере: docs.djangoproject.com/en/2.1/ref/urls/#path

4. Нет, я не включал его в URL-адреса моих проектов. Только в моем приложении. Это, вероятно, исправит это, как только я добавлю его туда. Спасибо. 🙂