React + Django Axios问题

时间:2018-12-11 01:34:01

标签: django reactjs axios

我有一个React应用程序链接到两个单独服务器上的Django后端。我正在为Django使用DRF,并且允许使用django-cors-headers进行cors。由于某种原因,当我卷曲POST后端时,我能够发出请求。但是,当我使用axios POST后端时,出现错误。来自axios的POST请求的状态失败。该请求需要10秒钟以上才能完成。我的代码在本地工作(react和django代码),但是当我部署到AWS ec2 ubuntu时,axios请求停止工作。

控制台错误日志

@Query("select c from Category c left outer join fetch c.items is left outer join fetch is.Item where t.id = :id")
Category getOneWithItems(@Param("id") Long id);
$nameArr = [];
$responsArray=json_decode($res->getBody());
foreach($responsArray->workspaces->workspace as $row)
{
  $nameArr[] = $row->name;
}
dd($nameArr);

这是我的请求代码

OPTIONS http://10.0.3.98:8000/token-auth/ net::ERR_CONNECTION_TIMED_OUT

我有效的curl代码

{
  "config": {
    "transformRequest": {},
    "transformResponse": {},
    "timeout": 0,
    "xsrfCookieName": "XSRF-TOKEN",
    "xsrfHeaderName": "X-XSRF-TOKEN",
    "maxContentLength": -1,
    "headers": {
      "Accept": "application/json, text/plain, */*",
      "Content-Type": "application/json;charset=UTF-8",
      "Access-Control-Allow-Origin": "*"
    },
    "method": "post",
    "url": "http://10.0.3.98:8000/token-auth/",
    "data": "{\"username\":\"testaccount\",\"password\":\"testpassword\"}"
  },
  "request": {}
}

更新1

在Firefox上我收到警告

  

跨源请求被阻止:同源策略禁止阅读   http://10.0.3.98:8000/token-auth/上的远程资源。 (原因:   CORS请求未成功)。[了解更多]

更新2

也许与我的AWS VPC和子网有关?我的django服务器位于私有子网中,而我的react应用位于公共子网中。

更新3-我对问题所在的想法

我认为来自axios的请求无法正常工作的原因是,我正在发出的请求将请求标头的来源设置为http://18.207.204.70:3000-公共/外部IP地址-而不是私有/内部ip地址,http://10.0.2.219:3000-我在网上搜索起源是一个禁止字段,因此无法更改。那我该如何设置原点?我是否必须使用代理-我该怎么做。

2 个答案:

答案 0 :(得分:0)

尝试此http请求而不是 axios ,它称为超级代理(https://www.npmjs.com/package/superagent),只需通过npm将其安装到您的react应用中,

npm i superagent

并使用它代替axios。

import request from 'superagent'

    const payload ={
                    "1": this.state.number,
                    "2": this.state.message
                    }


    request.post('LINK HERE')
            .set('Content-Type', 'application/x-www-form-urlencoded')
            .send(payload)
            .end(function(err, res){
                if (res.text==='success'){
                    this.setState({
                        msgAlert: 'Message Sent!',
                    })
                }
                else{
                    console.log('message failed/error')
                }
            }); 

答案 1 :(得分:0)

这里的问题是请求是在客户端浏览器上发出的。您需要使用反向代理或直接向api服务器请求。您也不能执行本地ssh转发。