Как заставить 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 использовать этот тип содержимого.