Django-rest-framework + React-Admin: проблема обратной косой черты URL - PullRequest
0 голосов
/ 29 августа 2018

У меня есть django rest api, который реализует наборы, как показано ниже.

class SubjectViewSet(viewsets.ModelViewSet):
    pagination_class = ContentRangeHeaderPagination
    queryset = Subject.objects.all()
    serializer_class = SubjectSerializer

Точно так же мой интерфейс основан на response-admin здесь

import React from 'react';
import { Admin, Resource } from 'react-admin';
import simpleRestProvider from 'ra-data-simple-rest';
import { NonIndividualList, NonIndividualCreate, NonIndividualEdit} from './subjects';

const App = () => (<Admin dataProvider=simpleRestProvider('http://localhost:8000/api/v1/coreapp')}>

<Resource name="subject" title="Non-Individuals" list={NonIndividualList} 
create={NonIndividualCreate} edit={NonIndividualEdit}/>
</Admin>);
export default App;

На моем сервере отдыха, в файле settings.py, у меня есть следующие настройки

APPEND_SLASH = False

Наконец, мое приложение / urls.py выглядит так

router = DefaultRouter()
router.register(r'api/v1/coreapp/subject', views.SubjectViewSet)

urlpatterns = [(r'^', include(router.urls)),]

Вопрос:

От почтальона, я могу удобно выбрать конечную точку

Однако мой клиент реакции-администратора не добавляет завершающий слеш

Вместо этого Http-действия Create / Put отправляют запросы на URL. Заметили пропущенную обратную косую черту?

http://localhost:8000/api/v1/coreapp/subject

Я пытался,

1- Установите Append_Slash = True 2- Добавлен / к имени ресурса, к которому просто добавляется две обратные косые черты

<Resource name="subject/"/>

http://localhost:8000/api/v1/coreapp/subject//2

для PUT, обратите внимание на дополнительную обратную косую черту.

Суть в том, что мой сервер принимает запросы, когда они имеют обратную косую черту.

Мое приложение реакции-администратора не добавляет обратную косую черту к запросам. Пожалуйста, ТАК, посоветуйте брату: -)

Ответы [ 3 ]

0 голосов
/ 30 августа 2018

@ Гилдас-Garcia

Я последовал вашему ответу, и насколько это имело смысл, проблема возникла еще раз. При отправке запроса / добавляется / в конце URL-адреса var после добавления параметров запроса

Желаемый URL (добавить обратную косую черту перед?)

http://localhost:8000/api/ps/nonindividual/?filter=%7B%7D&range=%5B0%2C9%5D&sort=%5B%22id%22%2C%22DESC%22%5D

Когда я слежу за вашим ответом, я получаю (обратная косая черта добавляется в конце полного URL)

http://localhost:8000/api/ps/nonindividual?filter=%7B%7D&range=%5B0%2C9%5D&sort=%5B%22id%22%2C%22DESC%22%5D/

Двигаясь вперед, я решил найти индекс? в URL и добавил обратную косую черту в этом индексе

const httpClient = (url, options = {}) => {

    var pos = url.indexOf('?');
    var b = "/";
    var _url = [url.slice(0, pos), b, url.slice(pos)].join('');

    //url = url + '/';
    return fetchUtils.fetchJson(_url, options);
}

const dataProvider = simpleRestProvider('http://localhost:8000/api/v1/coreapp', httpClient)


const App = () => (    
    <Admin dataProvider={dataProvider}
    <Resource name="subject" list={SubjectList} create={SubjectCreate} edit={SubjectEdit}/>
    </Admin>);

    export default App;

??

0 голосов
/ 04 января 2019

По умолчанию к URL-адресам, созданным DefaultRouter, добавляется косая черта. Это поведение можно изменить, установив аргумент trailing_slash в False при создании экземпляра маршрутизатора. Например:

router = DefaultRouter(trailing_slash=False)
0 голосов
/ 30 августа 2018

Это ваша задача dataProvider преобразовать запрос в форму, ожидаемую вашим бэкэндом, и использовать правильный URL.

В вашем случае вам придется настроить httpClient, как описано в документации dataProvider :

import { fetchUtils, Admin, Resource } from 'react-admin';
import simpleRestProvider from 'ra-data-simple-rest';

const httpClient = (url, options = {}) => {
    let finalUrl = `${url}/`;
    return fetchUtils.fetchJson(finalUrl, options);
}
const dataProvider = simpleRestProvider('http://localhost:3000', httpClient);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...