在同一服务器和端口上运行EmberJS和Django

3

我想在同一台服务器上运行EmberJS和Django,以避免跨域请求。比如说,我想在

exemple.com:80

上运行EmberJS,而在

exemple.com:80/api/

上运行Django REST API。我通常使用命令ember serve --port 80启动Ember,而使用命令python manage.py runserver 0.0.0.0:8000启动Django。但是这样做会导致两个服务器在不同的域上,并出现跨域问题。

我该怎么做才能在同一端口上同时运行这两个应用?

2个回答

3
最常见的做法是在不同的端口上运行django和ember,并在80端口使用反向代理将请求代理到需要的位置。Nginx是一个流行的选择(参见http://nginx.com/resources/admin-guide/reverse-proxy/)。
所需示例配置:
server {
  listen 127.0.0.1:8080;

  location / {
    proxy_pass http://127.0.0.1:4200; # ember server
    # ... additional proxy config
  }
  location /api {
    proxy_pass http://127.0.0.1:8080; # django server
    # ... additional proxy config
  }
}

Ember CLI也可以代理API请求到另一个服务器,但我不确定在生产环境中是否可行。


执行此操作时,nginx 给出以下错误: nginx: [emerg] bind() to 127.0.0.1:8080 failed (98: Address already in use) - Simoyw
@user3178668 抱歉,请将 listen 127.0.0.1:8080; 更改为 listen 127.0.0.1:80; - Jakeii
通过将Django端口更改为8000并将监听端口更改为80来解决问题。此外,我将127.0.0.1更改为example.com,以使EmberJs应用程序在外部可见。 - Simoyw

2
你遇到了内容安全策略的问题如ember-cli用户指南中所述。你可以放宽策略如此处所述,但我建议不要这样做。 ember server命令是设置文件服务器以测试你的Ember代码的简单方法,但它并不适用于生产环境。请记住,Ember应编译为JavaScript资源文件,然后通过后端服务器进行服务或通过CDN进行托管(并通过后端应用程序提供的HTML/模板中的脚本标签进行引用)。
对于Django来说,这意味着你需要:
  1. 将你的Ember应用程序编译为JS文件
  2. 将其放在Django的静态目录中
  3. 在你的index视图中引用这个JS文件
  4. 像平常一样启动Django(但不要运行ember server)。
如果在开发模式下这样做太痛苦了,那么我建议尝试使用 ember server --proxy 命令。看起来你可以使用 ember server --proxy 80 并在端口80上运行django,尽管 可能不能直接使用

谢谢你的建议。我想我会在生产中使用它。 使用“ember server --proxy 80”不起作用。 - Simoyw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接