提问人:Ali Hamza 提问时间:4/5/2023 最后编辑:Ali Hamza 更新时间:4/5/2023 访问量:58
无法从 /api 访问我的 Django 应用程序
cannot access my Django application from /api
问:
我已经在我的本地机器 Windows 笔记本电脑上的 kubernetes 上部署了我的 django Api。
我还设置了 kubernetes 部署、LoadBalancer 服务和入口文件。 但是当我尝试使用路径 http://localhost/api/my-api-endpoint 访问api时,它不起作用,并抛出错误服务器未找到。
虽然我只需使用 https://locahost/my-api-endpoint 即可成功连接
下面是我的服务文件和Docker文件:
# START Service
apiVersion: v1
kind: Service
metadata:
name: peopledb-api-service
labels:
app: peopledb-api-service
spec:
type: LoadBalancer
ports:
- port: 80 #port that the service exposes
targetPort: 8000 #port that the app is receiving requests from via the pod
selector:
name: peopledb-api-deployment
# END SERVICE
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: django-api-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: localhost
- http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: peopledb-api-service
port:
number: 80
Docker 文件:
FROM python:3.9.7-slim
ENV PYTHONUNBUFFERED=1
WORKDIR /api
COPY requirements.txt /api/
RUN pip install -r requirements.txt
COPY . /api/
EXPOSE 8000
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
请注意,我没有包含任何自定义 nginx 配置文件,或者我也没有在我的 Django 应用程序设置中指定任何基本 URL。
我做错了什么?我需要使用 nginx 的自定义配置吗?如果是,那又怎样? 我是否需要在 Django 应用或 Django 应用设置的 API URL 中指定任何基本 URL?
更新了有效的 Ingress 配置:
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: django-api-ingress
annotations:
nginx.ingress.kubernetes.io/use-regex: "true"
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /api/.*
pathType: Prefix
backend:
service:
name: peopledb-api-service
port:
number: 80
host: localhost
请注意,在此更新中,我添加了 Host,使用正则表达式而不是 rewrite-target,并使用正则表达式更新了路径。
为了解决这个问题,我在所有 Api 端点的前面添加了前缀“api/”,它抛出错误“无法匹配配置的 django appURL 中的空路径”
例如,更新前:path: api/
endoint_url = get_token
更新后:endoint_url = api/get_token
答:
0赞
Michał Lewndowski
4/5/2023
#1
您的定义中存在错误配置。 应该是块的一部分。ingress
host
http
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: django-api-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: peopledb-api-service
port:
number: 80
host: localhost
请参阅此文档。
评论
0赞
Ali Hamza
4/5/2023
我尝试更新规则并添加主机:localhost 请求开始到达 nginx,当我使用 localhost/api 时,这会抛出与 App config.urls 中的空路径不匹配,因此我不得不在 django App.urls 中为我的所有 API 端点添加前缀。在这些更改之后它起作用了,但我仍然不知道这是否是用户入口的正确方法,或者它只是因为我在 django 应用程序中更改了我的 API URL。我也在问题中添加了更新的文件。.
评论