#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.py2. Вы включили свой
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. Либо добавьте свой URLpath()
в эту конфигурацию, либо создайте свой собственныйurls.py
и включите его в корневую конфигурацию, как в этом примере: docs.djangoproject.com/en/2.1/ref/urls/#path4. Нет, я не включал его в URL-адреса моих проектов. Только в моем приложении. Это, вероятно, исправит это, как только я добавлю его туда. Спасибо. 🙂