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