Заголовки Axios работают для запроса GET Django, но не для запроса PUT - PullRequest
0 голосов
/ 08 ноября 2018

Я могу успешно сделать запрос GET для моего / rest-auth / user / api с помощью axios и этого заголовка

{headers: { 'authorization': `Token ${token}`}}

Но когда я пытаюсь сделать запрос PUT, я получаю 401 несанкционированный. Это полный код моего запроса:

export const addCountry = (countries) => {
  const token = localStorage.getItem('token');
  return dispatch => {
    dispatch(addCountryPending());
    axios.put(
        'http://localhost:8000/api/v1/rest-auth/user/',
        {headers: { 'authorization': `Token ${token}`}},
        {countries: countries}
    )
      .then(response => {
        const user = response.data;
        dispatch(addCountryFulfilled(user));
      })
      .catch(err => {
        dispatch(addCountryRejected(err));
      })
  }
}

и мои разрешения Django установлены как

REST_FRAMEWORK = {
   'DEFAULT_AUTHENTICATION_CLASSES': [
       'rest_framework.authentication.TokenAuthentication',
   ],

Кто-нибудь знает, что я делаю не так? Спасибо!

edit: представление по умолчанию / rest-auth / user / view, но я настроил сериализатор так:

class UserDetailSerializer(UserDetailsSerializer):
    countries = serializers.SlugRelatedField(
        many=True, slug_field='name',
        queryset=Country.objects.all().order_by('pk')
        )
    count = serializers.IntegerField(read_only=True)

    class Meta:
        model = User
        fields = ('pk', 'username', 'email', 'count', 'countries')

и у меня есть пользовательская модель:

class User(AbstractUser):
    countries = models.ManyToManyField(Country, blank=True)
    count = models.IntegerField(blank=True, default=0)

    def save(self, *args, **kwargs):
        # Must save model before Many To Many relationship can be used.
        super(User, self).save(*args, **kwargs)
        self.count = self.countries.count()
        super(User, self).save(*args, **kwargs)

Я пытаюсь отправить запрос PUT со страной, чтобы добавить эту страну в список стран для аутентифицированного пользователя.

1 Ответ

0 голосов
/ 08 ноября 2018

В функциях axios get и put имеют различную семантику. Функции get получают объект конфигурации как второй параметр:

axios.get(url[, config])

А функция put подобна третьему параметру:

axios.put(url[, data[, config]])

Итак, вы должны добавить свои заголовки так:

axios.put(
    'http://localhost:8000/api/v1/rest-auth/user/',
    {}, // data
    {
        countries: countries,
        headers: { 'authorization': `Token ${token}`},
    }
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...