Я продолжаю получать <WSGIRequest GET: '/create-link-token'>; проблемы с подключением django к plaid api
Я пытаюсь подключить свой бэкенд Django к API Plaid, но я застрял на том, как вернуть только тело из объекта.
Вот трассировка, которую я получаю:
Насколько я могу судить, проверив мою конфигурацию, он пытается запросить токен ссылки и другую информацию с серверов plaid, но ему это не удается.
callback <function create_link_token at 0x000002283648B5E0>
callback_args ()
callback_kwargs {}
middleware_method <bound method CsrfViewMiddleware.process_view of
<CsrfViewMiddleware get_response=convert_exception_to_response.
<locals>.inner>>
request <WSGIRequest: GET '/create-link-token'>
response None
self <django.core.handlers.wsgi.WSGIHandler object at
0x0000022834FF1040>
wrapped_callback <function create_link_token at 0x000002283648B5E0>
На данный момент я просмотрел документацию и поискал в Google, чтобы выяснить, сталкивались ли другие с подобными проблемами. Не нашел ничего полезного, по крайней мере, для моей ситуации. Поскольку эта ошибка исходит из исключений ядра django, я попытался найти способы переопределить это исключение.
После того, как я сосредоточился на своей проблеме, мой вопрос теперь звучит так: "Как я могу вернуть тело в поле запроса, когда я не могу получить доступ к запросам?". Возможно, я ошибаюсь, но у меня сложилось впечатление, что у меня нет способа подделать запрос, чтобы я мог манипулировать данными, которые он получает.
Вот мой код:
views.py
PLAID_CLIENT_ID = os.getenv('PLAID_CLIENT_ID')
PLAID_PUBLIC_KEY = os.getenv('PLAID_PUBLIC_KEY')
PLAID_SECRET = os.getenv('PLAID_SECRET')
PLAID_ENVIRONMENT = os.getenv('PLAID_ENV', 'development')
configuration = plaid.Configuration(
host=plaid.Environment.Development,
api_key = {
'clientId': PLAID_CLIENT_ID,
'secret': PLAID_SECRET,
'plaidVersion': '2020-09-14',
}
)
api_client = plaid.ApiClient(configuration)
client = plaid_api.PlaidApi(api_client)
# We store the access_token in memory - in production, store it in a secure
# persistent data store.
access_token = None
# The payment_id is only relevant for the UK Payment Initiation product.
# We store the payment_id in memory - in production, store it in a secure
# persistent data store.
payment_id = None
# The transfer_id is only relevant for Transfer ACH product.
# We store the transfer_id in memomory - in produciton, store it in a secure
# persistent data store
transfer_id = None
item_id = None
def index(request):
if request.method == 'GET':
return True
def create_link_token(request):
try:
# Get the client_user_id by searching for the current user
# Create a link_token for the given user
request = LinkTokenCreateRequest(
products=[Products("auth")],
client_name="Plaid Test App",
country_codes=[CountryCode('US')],
language='en',
user=LinkTokenCreateRequestUser(
client_user_id=str(time.time())
)
)
response = client.link_token_create(request)
link_token = response['link_token']
# Send the data to the client
return JsonResponse(link_token)
except plaid.ApiException as e:
return json.dumps(e.body)
и urls.py
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path('create-link-token', views.create_link_token, name='create-link-token'),
]
Если я могу предоставить что-то еще, пожалуйста, дайте мне знать.
У меня была точно такая же ошибка. Моя проблема заключалась в неправильном именовании моих переменных env. Например:
В моем .env.dev я назвал свои env var следующим образом:
PLAID_CLIENT_ID = xxxxxxxxxxxx
Импортировано в мои настройки Django как:
PLAID_CLIENT = os.envrion.get('PLAID_CLIENT')
РЕШЕНИЕ:
Убедитесь, что ваши env vars верны. Обертка plaid-python пока не обеспечивает хорошую обработку исключений для этого.
Проблема заключается в следующих строках кода. Слово "request" является специальным в Django - вы передаете его в определении функции.
request = LinkTokenCreateRequest(
products=[Products("auth")],
client_name="Plaid Test App",
country_codes=[CountryCode('US')],
language='en',
user=LinkTokenCreateRequestUser(
client_user_id=str(time.time())
)
)
response = client.link_token_create(request)
Измените сниппет на следующий:
plaid_request = ...
plaid_response = client.link_token_create(plaid_request)
Также - я бы настоятельно рекомендовал изменить client на что-то более явное - например, plaid_client.