【问题标题】:Why my angular HTTP request can't GET on local Django server?为什么我的 Angular HTTP 请求无法在本地 Django 服务器上获取?
【发布时间】:2019-09-21 00:18:36
【问题描述】:

我制作了一个 Angular 应用程序,它可以使用在线 api 来获取 json 并做一些事情。 但是,虽然 json 是相同的,但如果我尝试通过设置用 django 编写的服务器的本地 url 来仅更改 json 的 url,则 angular 似乎不再连接......

我的问题是,为什么如果使用在线云服务器可以使用,而使用本地服务器则不行?

我尝试让这台服务器“在云上”打开路由器的端口,还设置了一个 ddns,并使用邮递员或浏览器似乎可以工作,但是当我尝试使用 angular 连接时,它仍然无法获取数据...

我确信 100% 服务器会使用正确的 json 数据进行回答,因为 django 在控制台上打印出他收到了 HTTP GET 请求: http://i.imgur.com/TIQnIcR.png

我提醒你,HTTP 角度请求与另一个 api 一起工作,但我仍会显示一些代码:

export class ProdottoService {
  private prodotti: Array<ProdottoModel>;
  constructor(private httpClient: HttpClient) {
    this.prodotti = new Array<ProdottoModel>();

    var url:string = "https://gist.githubusercontent.com/saniyusuf/406b843afdfb9c6a86e25753fe2761f4/raw/523c324c7fcc36efab8224f9ebb7556c09b69a14/Film.JSON";
    var local_url:string = "http://127.0.0.1:8000/films/?format=json";

    httpClient.get(local_url)
        .subscribe((films : Array<Object> ) => {
          films.forEach((film => {
                this.prodotti.push(new ProdottoModel(film));
            }));
          }
        );

  }
  getProdotti(): Array<ProdottoModel> {
    return this.prodotti;
  }
}

使用外部 api 的结果:

http://i.imgur.com/MT7xD9c.png

感谢您的任何帮助:3

-- 编辑 -- 是一个 CORS 问题

在 django settings.py 文件中:


CORS_ORIGIN_WHITELIST = (
    'localhost:8000',
    '127.0.0.1:4200'
)


INSTALLED_APPS = (
    ...
    'corsheaders',
    ...
)

MIDDLEWARE = [  # Or MIDDLEWARE_CLASSES on Django < 1.10
    ...
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    ...
]

但我不知道是否有办法在 Angular 中设置 CORS 设置

【问题讨论】:

  • 这里是服务器django的代码,前端的角码:github.com/fl0wo/films-angular-django
  • 是什么让您认为您没有获取 json?如果您使用的是 Chrome,请打开网络选项卡并查看您的应用程序是否正在拨打电话(您的服务器似乎正在接到电话?)。
  • 这是在 Chrome 上刷新标签时发生的情况:i.imgur.com/ZVEWSHd.png 是的,服务器显然通知我他刚刚回答了一个 GET 请求...

标签: django angular


【解决方案1】:

根据反馈,这是一个 CORS 问题。您的 Django 服务器正在获取请求并做出响应,因为 localhost 是 Django 开发环境中隐式受信任的域,但它没有正确配置为设置跨源标头,因此浏览器不允许您的应用程序看到响应,因为服务器没有明确授权域。

这里的问题是你设置了这样的 CORS 白名单:

CORS_ORIGIN_WHITELIST = ( 'localhost:8000', '127.0.0.1:4200' )

应该是这样的:

CORS_ORIGIN_WHITELIST = ( 'localhost:4200' )

angular 在 localhost 上运行,而不是 127.0.0.1,即使这是 localhost 的别名,您的浏览器仍然会区分它们以用于 CORS。此外,您不需要将您服务的域列入白名单,因为它是同一个来源,所以不会跨越任何来源。

【讨论】:

  • 这是有道理的,但它从不记录任何东西......即使放置一个“警报”方法,它似乎甚至都没有进入订阅回调......i.imgur.com/hVv5ZBR.png
  • Bryan:对我来说它看起来像一个数组,但屏幕截图切断了左方括号的一部分。不过好想。 Florian:你也可以添加“debugger;”而不是console.log,它将停止代码,如果开发控制台打开,您可以探索发生了什么。
  • @FlorianSabani 在您的日志中什么都没有显示,但是您确定正在调用构造函数(即您在请求之前已经进行了一些登录)?这听起来像是出于某种原因,角度令人窒息。是否存在某种 CORS 问题?虽然那绝对应该记录...
  • @StevenLacks 可能,屏幕截图已被截断,但看起来像 chrome,我的 chrome 使 JSON 变得漂亮,无论是那个还是 CORS 问题都是我对此的最佳猜测。
  • 我不知道是否存在“静默 CORS 问题”,我只知道似乎一切正常,没有错误日志,我在 django 服务器上定义了 CORS_WHITELIST,所以我确信任何人都可以连接到本地主机: 8000 服务器...:/,事实上,当我与 angular 连接时,服务器会看到他并以正确的响应回答,但 angular 似乎忽略了它:C
【解决方案2】:

在您的屏幕截图中,响应似乎是键入“文档...”。最简单的解决方法(此处仅包含代码)是将字符串转换为 JSON。

JSON.parse(films)

这是错误的答案,因为其他答案中存在 CORS 问题,因此将其设置为该答案。

【讨论】:

  • Angular 和 Django 通常都非常擅长正确设置它们的标题而无需人工干预。鉴于他在其他 cmets 中说他甚至没有在订阅回调中获得日志语句,我认为还有其他事情发生。
  • 它明确地返回了一个 MIME 类型的“文档”
  • 浏览器处理了这个请求,尽管他直接通过浏览器访问了他的 API 端点。文档是来自 URL 栏的直接请求的默认内容类型。直接点击时,远程 URL 显示相同的类型。
  • 没关系,您通过 URL 栏点击的主要域始终强制转换为 Document 类型,因为浏览器始终显示文档并且只接受 Document。这是一个 CORS 问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
  • 2018-07-23
  • 2020-09-26
  • 2017-12-16
  • 1970-01-01
  • 2023-04-11
相关资源
最近更新 更多