django - docker-compose:无法从 Nuxt 容器中访问 Django 容器
问题描述
我的后端 (localhost:8000) 和前端 (locahost:5000) 容器都启动并可以通过浏览器访问,但我无法从前端容器访问后端容器。
从前端内部:
/usr/src/nuxt-app # curl http://localhost:8000 -v
* Trying 127.0.0.1:8000...
* TCP_NODELAY set
* connect to 127.0.0.1 port 8000 failed: Connection refused
* Trying ::1:8000...
* TCP_NODELAY set
* Immediate connect fail for ::1: Address not available
* Trying ::1:8000...
* TCP_NODELAY set
* Immediate connect fail for ::1: Address not available
* Failed to connect to localhost port 8000: Connection refused
* Closing connection 0
curl: (7) Failed to connect to localhost port 8000: Connection refused
我的 nuxt 应用程序(前端)正在使用 axios 来调用http://localhost:8000/preview/api/qc/
. 当前端启动时,我可以看到 axios 正在捕获errorError: connect ECONNREFUSED 127.0.0.1:8000
. 但在控制台中它说[HMR] connected
。
如果我对 进行更改index.vue
,前端会重新加载,然后在控制台中显示:
access to XMLHttpRequest at 'http://localhost:8000/preview/api/qc/' from origin 'http://localhost:5000' has been blocked by CORS policy: Request header field access-control-allow-origin is not allowed by Access-Control-Allow-Headers in preflight response. VM11:1 GET http://localhost:8000/preview/api/qc/ net::ERR_FAILED
我已经设置了django-cors-headers
(包括在INSTALLED_APPS
, 和 set ALLOWED_HOSTS = ['*']
and中CORS_ALLOW_ALL_ORIGINS = True
)。
在我的nuxt.config.js
我已经设置
axios: {
headers : {
"Access-Control-Allow-Origin": ["*"],
}
},
我不知道出了什么问题。我认为这可能是我的docker-compose
or Dockerfile
。
码头工人-compose.yml
backend:
build: ./backend
volumes:
- ./backend:/srv/app
ports:
- "8000:8000"
command: python manage.py runserver 0.0.0.0:8000
depends_on:
- db
networks:
- main
frontend:
build:
context: ./frontend
volumes:
- ./frontend:/usr/src/nuxt-app
- /usr/src/nuxt-app/node_modules
command: >
sh -c "yarn build && yarn dev"
ports:
- "5000:5000"
depends_on:
- backend
networks:
- main
networks:
main:
driver: bridge
Dockerfile
FROM node:15.14.0-alpine3.10
WORKDIR /usr/src/nuxt-app
RUN apk update && apk upgrade
RUN npm install -g npm@latest
COPY package*.json ./
RUN npm install
EXPOSE 5000
ENV NUXT_HOST=0.0.0.0
ENV NUXT_PORT=5000
我错过了什么?
解决方案
我认为你有2个不同的错误。
第一个。
我的 nuxt 应用程序(前端)正在使用 axios 调用 http://localhost:8000/preview/api/qc/。当前端启动时,我可以看到 axios 捕获 errorError: connect ECONNREFUSED 127.0.0.1:8000。虽然在控制台中显示 [HMR] 已连接。
这是从 nuxt 到 django 的 SSR 请求。容器内的 Nuxt 应用无法连接到 localhost:8000。但是您可以通过 http://django_container:8000/api/qc/ 连接到 django 容器,其中django_container
django 容器的名称。
在 nuxt 配置中,您可以像这样为服务器端和客户端设置不同的 URL。所以 SSR 请求直接转到 docker django 容器,客户端请求转到 localhost 端口。
nuxt.config.js
export default {
// ...
// Axios module configuration: https://go.nuxtjs.dev/config-axios
axios: {
baseURL: process.browser ? 'http://localhost:8000' : 'http://django_container:8000'
},
// ...
}
第二个。
从源“http://localhost:5000”访问“http://localhost:8000/preview/api/qc/”处的 XMLHttpRequest 已被 CORS 策略阻止:请求标头字段 access-control-allow-origin 不是Access-Control-Allow-Headers 在预检响应中允许。VM11:1 GET http://localhost:8000/preview/api/qc/net::ERR_FAILED
这是从浏览器到 django 的客户端请求。我认为最好CORS_ORIGIN_WHITELIST
明确设置。您也可以允许CORS_ALLOW_CREDENTIALS
. 我不能保证,但我希望它有所帮助。
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_WHITELIST = ['http://localhost:5000', 'http://127.0.0.1:5000']
推荐阅读
- asp.net-core - Asp.net 登录页面 - 无法使用 PasswordSignInAsync 登录
- arrays - Swift:如何使用自定义谓词检查日期是否连续
- prolog - 从谓词返回多个对象
- c# - .NET:如何使用 Entity Framework Core 3.1 Migrations 的 CreateTableBuilder 定义唯一约束?
- javascript - ESLint 错误:列表中的每个孩子都应该有一个唯一的“关键”道具
- date - 有没有办法解决这个神秘的时间编码?
- ruby-on-rails - bundle exec rake db:seed only 种子大约一半的数据
- java - Hive : Tez 如何增加 AM Container 内存
- asp.net - ASP.Net Core 项目找不到它的 Javascript 文件
- git - Git,如何找出特定月份的提交次数