我有一个django rest api,它实现了如下所述的视图集。
class SubjectViewSet(viewsets.ModelViewSet):
pagination_class = ContentRangeHeaderPagination
queryset = Subject.objects.all()
serializer_class = SubjectSerializer
类似地,我的前端基于react-admin here
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
最后,我的app / urls.py看起来像这样
router = DefaultRouter()
router.register(r'api/v1/coreapp/subject', views.SubjectViewSet)
urlpatterns = [(r'^', include(router.urls)),]
问题:
从邮递员那里,我可以轻松地终结端点
但是,我的react-admin客户端未添加斜杠
相反,Http-Actions Create / Put将请求发送到url。 注意到缺少的尾部反斜杠了吗?
我试图
1-设置Append_Slash = True 2-在资源名称中添加了/,只需在其后添加两个反斜杠
<Resource name="subject/"/>
对于PUT,请注意其他反斜杠。
最重要的是,只要有反斜杠,我的服务器就会接受请求。
我的react-admin应用程序不对请求添加反斜杠。 所以请给兄弟一个建议:-)
答案 0 :(得分:1)
@ gildas-garcia
我遵循了您的回答,并在合理范围内再次出现了此问题。 发送请求后,在附加查询参数之后
,在URL var的末尾添加/。所需的URL(在?之前添加反斜杠)
当我按照您的答案回答时(在完整URL的末尾添加反斜杠)
继续前进,我选择查找?的indexOf。在网址中,并在该索引处添加反斜杠
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;
答案 1 :(得分:0)
dataProvider
的工作就是将请求转换为后端所需的形状并使用正确的url。
在这种情况下,您必须按照dataProvider documentation中的说明自定义httpClient:
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);
答案 2 :(得分:0)
默认情况下,DefaultRouter
创建的URL后面加上斜杠。实例化路由器时,可以通过将Trailing_slash参数设置为False来修改此行为。例如:
router = DefaultRouter(trailing_slash=False)
答案 3 :(得分:0)
此外,当您指定URL路由末尾的斜杠时:
urlpatterns = [
path('rolls/', SomeListView.as_view()),]