Как заставить ApolloClient использовать multipart/form-data при отправке запросов к конечной точке django graphql

Я пишу приложение Django/GraphQL/Apollo/Vuetify, и мне трудно ориентироваться в последствиях CORS/CRSF.

Насколько я понимаю, я думаю, что Django и GraphQL делают правильные вещи на бэкенде в отношении CORS и CRSF. Когда я использую библиотеку python requests, я могу успешно отправить запрос на конечную точку graphql и получить ответ. Для этого я отправляю запрос POST с Content-Type multipart/form-data и убеждаюсь, что data содержит правильное csrfmiddlewaretoken значение.

@when(u'we execute the GraphQL query "{query}"')
def step_impl(context, query):
    context.response = context.rest_client.post("/graphql/", data={"query": query})
    def post(self, path, **kwargs):
        csrftoken = self.session.cookies.get('csrftoken')
        if 'data' in kwargs and csrftoken:
            kwargs['data']['csrfmiddlewaretoken'] = csrftoken
        return self.session.post(url(path), **kwargs)

Однако ApolloClient настаивает на отправке запроса с использованием application/json, а не multipart/form-data. В результате я не могу добавить поле csrfmiddlewaretoken в полезную нагрузку запроса и получаю ответ 403 Forbidden.

Я выполнил шаги, описанные в https://apollo.vuejs.org/guide-option/setup.html

import { registerPlugins } from '@/plugins'
import mitt from "mitt"

import { ApolloClient, InMemoryCache } from '@apollo/client/core'

const cache = new InMemoryCache()

const apolloClient = new ApolloClient({
  cache,
  uri: 'http://localhost:8000/graphql/',
  credentials: 'include'
})

import { createApolloProvider } from '@vue/apollo-option'

const apolloProvider = createApolloProvider({
  defaultClient: apolloClient,
})

const app = createApp(App)
app.use(apolloProvider)

Это вызывает ошибку:

Error sending the query 'copies' TypeError: Failed to fetch

На вкладке "Сеть" в Chrome указано два запроса к конечной точке graphql. Один из них завершился успешно, а другой - неудачно.

В неудачном запросе есть Content-Type application/json, и я думаю, что проблема именно в этом. У меня была похожая проблема с моим клиентом на основе запросов python, которая была решена, когда я начал использовать Content-Type multipart/form-data. Я просто не знаю, как убедить ApolloClient использовать этот тип содержимого.

Вернуться на верх