无法从 reactjs 中的 axios 向 id=1 文章的 django REST API 后端发出 GET 请求

Posted

技术标签:

【中文标题】无法从 reactjs 中的 axios 向 id=1 文章的 django REST API 后端发出 GET 请求【英文标题】:Not able to make a GET request to the django REST API backend for the id=1 article, from axios in reactjs 【发布时间】:2021-06-24 01:18:25 【问题描述】:

我有一个使用 reactjs 构建的前端应用程序,django rest 框架用于使用 API 为该前端提供服务。 django rest API 工作正常,我通过 Postman 进行了检查。

当我向 http://127.0.0.1:8000/articles/ 发出 GET 请求时,我会得到文章列表,当我点击其中一篇文章时,它应该会将我带到 article detail page 以获取文章的特定 ID。这是通过向 http://127.0.0.1:8000/articles/id 发出 GET 请求来完成的。

问题是,当我对 id=2,3,4,5,... 发出 GET 请求时,它工作正常。但是当我尝试请求 id=1 时,我在 chrome 浏览器的控制台中收到以下错误

Access to XMLHttpRequest at 'http://127.0.0.1:8000/articles/1' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
Error: Network Error
    at createError (createError.js:16)
    at XMLHttpRequest.handleError (xhr.js:84)

因此,根本没有发出请求(我从服务器端验证)。我得到的只是上述错误。 请注意articles/2articles/3 等不存在此类错误。我已在 django settings.py 文件中允许相关主机。

这是article detail page 的代码。

function ArticlePage(props) 
    const [MainArticle, setMainArticle] = useState();
    const id = useParams()
    const url = 'http://127.0.0.1:8000/articles/'+id;
    useEffect(() => 
        console.log("hello world");
        axios.get(url)
            .then((response) => 
                setMainArticle(response.data);
                console.log(response.data);
            )
            .catch((error)=>console.log(error))
    , [url]);
    return (
        <section className="postsBody">
            <Article 
                title=MainArticle.title
                author=MainArticle.author
                timestamp=MainArticle.timestamp
                content=MainArticle.content
            />
        </section>
    )

请帮我解决这个错误,通过调试我知道问题不在服务器端,GET 请求通过邮递员适用于 id=1。

【问题讨论】:

请用id = 1添加请求的响应。 @ZunayedShahriar 我已经更新了这个问题。对于 id=1,根本没有提出请求。我收到上面指定的错误。如果我不允许 django 的 ALLOWED HOSTS 中的本地主机,则此错误与我将得到的错误相同,但事实并非如此。 您的服务器端可能存在路由冲突。而且,我不了解 django。 如果是这样,那我为什么要通过邮递员得到正确的json数据 这真的很奇怪。 【参考方案1】:

这是因为 CORS 政策。即使您在设置中允许这些网站,您也需要明确允许这些网站从您的后端访问内容。在 Django 中安装 cors headers 应用程序并设置允许的来源。 cors headers 的文档有足够的信息。

【讨论】:

我在已安装的应用程序中提到了corsheaders,还添加了文档中提到的所需中间件。在 CORS_ALLOWED_ORIGINS 中列出了“localhost:3000”,但它仍然不起作用。我的意思是它当然适用于 1 以外的其他 id 值。请帮帮我。由于某种原因,我得到了相同的 Access to XMLHttpRequest at 'http://127.0.0.1:8000/articles/1' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. 错误。 我发现问题是浏览缓存,写了一个新的答案。【参考方案2】:

我最终发现了问题所在。问题是浏览器缓存。我更新了 django、djago-rest-framework、react 和 react-router-dom。然后我做了一个 localhost:3000 网站的hard reload,它最终开始工作了。关键是在添加corsheaders 之后清除浏览器缓存,它会起作用。我从这个Question得到了帮助

【讨论】:

以上是关于无法从 reactjs 中的 axios 向 id=1 文章的 django REST API 后端发出 GET 请求的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 ReactJs、Axios、Redux 渲染/显示从 api 获取的数据

无法使用 axios 和 ReactJS 执行获取请求

反应 js:axios 向 node.js api 发布请求

如何从本地主机查看 ReactJS 中的图像

从 Promise(ReactJS 和 Axios)中提取图像数据

Axios ReactJS - 无法读取未定义的属性“setState”