Django-rest-framework + React-Admin:URL 反斜杠问题

     2023-02-24     64

关键词:

【中文标题】Django-rest-framework + React-Admin:URL 反斜杠问题【英文标题】:Django-rest-framework + React-Admin : URL Backslash issue 【发布时间】:2019-02-03 17:59:22 【问题描述】:

我有一个 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 = 假

最后,我的 app/urls.py 看起来像这样

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

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

问题:

从邮递员那里,我可以轻松地完成端点

获取:http://localhost:8000/api/v1/coreapp/subject/, POST:http://localhost:8000/api/v1/coreapp/subject/, 输入:http://localhost:8000/api/v1/coreapp/subject/2/, 删除:http://localhost:8000/api/v1/coreapp/subject/1/,

但是,我的 react-admin 客户端没有附加斜杠

相反,Http-actions 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,请注意额外的反斜杠。

底线是,我的服务器只要有尾部反斜杠就接受请求。

我的 react-admin 应用程序不会在请求上附加反斜杠。 请SO,建议兄弟:-)

【问题讨论】:

请同时包含您的 react-admin 代码 你会如何解决这个问题?通过使用 DRF 处理不带斜杠的 URL 或借助 React Admin 添加斜杠? @Harikrishnan 我已经添加了代码。请随时索取任何有助于您帮助我的其他信息。 【参考方案1】: 一种解决方案可能是使用为 DRF 编写的特殊 dataProvider。 Here you can find it

另外,您在指定 URL 路由时在末尾附加斜杠:

urlpatterns = [ path('rolls/', SomeListView.as_view()),]

【讨论】:

【参考方案2】:

默认情况下,DefaultRouter 创建的 URL 会附加一个斜杠。可以通过在实例化路由器时将 trailing_slash 参数设置为 False 来修改此行为。例如:

router = DefaultRouter(trailing_slash=False)

【讨论】:

【参考方案3】:

@吉尔达斯加西亚

我听从了您的回答,尽管它是有道理的,但问题又出现了。 发送请求时,在附加查询参数后,在 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/

继续前进,我选择查找 indexOf ?在 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;

??

【讨论】:

你正在改变 url,这总是一个坏主意。您应该改为声明一个新变量并将其传递给fetchJson 函数 但是,我不明白你现在有什么问题。你能提供更多细节吗? @GildasGarcia 没问题,我能够解决我的错误。再次感谢【参考方案4】:

这是您的 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);

【讨论】:

记录对 django-rest-framework 的请求

】记录对django-rest-framework的请求【英文标题】:Loggingrequeststodjango-rest-framework【发布时间】:2013-03-1219:37:12【问题描述】:出于调试目的,我想使用Django的日志记录机制来记录每个“到达”django-rest-framework门口的传入请求。Djagno... 查看详情

django-rest-framework:如何序列化已经包含 JSON 的字段?

】django-rest-framework:如何序列化已经包含JSON的字段?【英文标题】:django-rest-framework:HowDoISerializeaFieldThatAlreadyContainsJSON?【发布时间】:2014-04-0501:41:03【问题描述】:我对django-rest-framework还是很陌生,所以需要一些帮助。我有一... 查看详情

django-rest-framework: api 版本控制

】django-rest-framework:api版本控制【英文标题】:django-rest-framework:apiversioning【发布时间】:2012-12-2512:52:55【问题描述】:谷歌搜索似乎普遍认为,在RESTURI中嵌入版本号是一种不好的做法和一个坏主意。即使在SO上,也有强烈的支持... 查看详情

django-rest-framework 按日期过滤=无

】django-rest-framework按日期过滤=无【英文标题】:django-rest-frameworkfilterbydate=None【发布时间】:2014-02-2611:35:00【问题描述】:我正在使用django-rest-framework和django-filter。我需要检索date属性为None的小部件列表,但无论我尝试什么查询... 查看详情

django-rest-framework、多表模型继承、ModelSerializers 和嵌套序列化器

】django-rest-framework、多表模型继承、ModelSerializers和嵌套序列化器【英文标题】:django-rest-framework,multitablemodelinheritance,ModelSerializersandnestedserializers【发布时间】:2014-07-2518:17:22【问题描述】:我在文档或互联网上找不到此信息。... 查看详情

为啥 django-rest-framework 不显示 OneToOneField 数据 - django

】为啥django-rest-framework不显示OneToOneField数据-django【英文标题】:Whydjango-rest-frameworkdoesn\'tdisplayOneToOneFielddata-django为什么django-rest-framework不显示OneToOneField数据-django【发布时间】:2018-02-1616:26:13【问题描述】:我想在我的网站中... 查看详情

如何在 django-rest-framework 中为 API 使用 TokenAuthentication

】如何在django-rest-framework中为API使用TokenAuthentication【英文标题】:HowtouseTokenAuthenticationforAPIindjango-rest-framework【发布时间】:2013-07-0718:26:11【问题描述】:我有一个django项目,使用django-rest-framework来创建api。想要使用基于令牌的... 查看详情

drf多表(代码片段)

https://www.django-rest-framework.org/ 官方站https://www.django-rest-framework.org/tutorial/quickstart/#serializers  --序列化一个例子fromdjango.conf.urlsimporturlfromdjango.contribimportadminfromapp01importviewsurlpatterns=[url(r‘^admin/‘,admin.site.urls),url(r‘books/(... 查看详情

django-rest-framework:每个 ViewSet 可以有多个模板吗?

】django-rest-framework:每个ViewSet可以有多个模板吗?【英文标题】:django-rest-framework:CanIhavemultipletemplatesperViewSet?【发布时间】:2020-07-0701:30:04【问题描述】:我为我的模型创建了一个序列化程序和ViewSet,并为列表视图添加了一个... 查看详情

我无法使用 Django-Rest-Framework 注册用户

】我无法使用Django-Rest-Framework注册用户【英文标题】:IcannotregisterauserusingDjango-Rest-Framework【发布时间】:2021-04-0621:11:54【问题描述】:我无法使用DjangoRestFramework添加新用户。这是我的models.py代码:classProfile(models.Model):user=models.O... 查看详情

使用 django-rest-framework 创建对象后返回 id 值

】使用django-rest-framework创建对象后返回id值【英文标题】:Returningidvalueafterobjectcreationwithdjango-rest-framework【发布时间】:2013-09-1920:32:03【问题描述】:我正在使用django-rest-framework通用视图通过POST请求在模型中创建对象。我想知道... 查看详情

django-rest-framework 是不是提供管理站点来管理模型?

】django-rest-framework是不是提供管理站点来管理模型?【英文标题】:Doesthedjango-rest-frameworkprovideanadminsitetomanagemodels?django-rest-framework是否提供管理站点来管理模型?【发布时间】:2020-12-1812:02:18【问题描述】:我正在寻找使用djang... 查看详情

Django-rest-framework + React-Admin:URL 反斜杠问题

】Django-rest-framework+React-Admin:URL反斜杠问题【英文标题】:Django-rest-framework+React-Admin:URLBackslashissue【发布时间】:2019-02-0317:59:22【问题描述】:我有一个djangorestapi,它实现了如下突出显示的视图集。classSubjectViewSet(viewsets.ModelView... 查看详情

无法使用视图名称 (django-rest-framework) 解析超链接关系的 URL

】无法使用视图名称(django-rest-framework)解析超链接关系的URL【英文标题】:CouldnotresolveURLforhyperlinkedrelationshipusingviewname(django-rest-framework)【发布时间】:2018-06-2919:50:26【问题描述】:问题:我收到这样的错误。在/api/users/处配置不... 查看详情

在视图集中创建的 Django-rest-framework 权限

】在视图集中创建的Django-rest-framework权限【英文标题】:Django-rest-frameworkpermissionsforcreateinviewset【发布时间】:2014-05-1017:03:02【问题描述】:我正在尝试创建一个RESTAPI并且卡在用户注册上:基本上我需要在注册之前获得访问令牌... 查看详情

django-rest-framework 令牌认证和注销

】django-rest-framework令牌认证和注销【英文标题】:django-rest-frameworkTokenAuthandlogout【发布时间】:2015-03-0707:21:07【问题描述】:据了解,obtain_auth_token视图用作登录功能。您提供凭据并取回令牌。什么会注销?我应该在注销时删除... 查看详情

Django-Rest-Framework 系统检查自定义 HTTP 标头(应用程序 - 令牌)

】Django-Rest-Framework系统检查自定义HTTP标头(应用程序-令牌)【英文标题】:Django-Rest-FrameworksystemtocheckcustomHTTPheader(application-token)【发布时间】:2020-04-1707:05:30【问题描述】:我使用Django和Django-rest-framework。我必须检查一个自定... 查看详情

如何在 django-rest-framework 中对权限进行单元测试?

】如何在django-rest-framework中对权限进行单元测试?【英文标题】:Howtounittestpermissionsindjango-rest-framework?【发布时间】:2016-09-0708:14:14【问题描述】:她的权限是我想要进行单元测试的示例权限。#permissions.pyfrommyapp.modelsimportMembersh... 查看详情