前提・実現したいこと
ローカルのDocker環境にて Django REST framework で作成したAPIに対してリクエストし、レスポンスを得たい
APIおよびフォームビューを作成したURL
Docker環境で80や8080を他のアプリのコンテナに割り当てているため、9003ポートを割り当てて行なっています
- フォームビュー
- 結果ビュー
- API
上記APIに直接GETでアクセスし、Django REST frameworkの画面から値をPOSTした際は、正常にレスポンスが得られている状態です。
発生している問題・エラーメッセージ
ConnectionError at /save HTTPConnectionPool(host='localhost', port=9003): Max retries exceeded with url: /api/v1/ (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f4f0ce5e950>: Failed to establish a new connection: [Errno 111] Connection refused')) Request Method: POST Request URL: http://localhost:9003/save Django Version: 3.2 Exception Type: ConnectionError Exception Value: HTTPConnectionPool(host='localhost', port=9003): Max retries exceeded with url: /api/v1/ (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f4f0ce5e950>: Failed to establish a new connection: [Errno 111] Connection refused')) Exception Location: /usr/local/lib/python3.10/site-packages/requests/adapters.py, line 516, in send Python Executable: /usr/local/bin/python3 Python Version: 3.10.1 Python Path: ['/code', '/usr/local/lib/python310.zip', '/usr/local/lib/python3.10', '/usr/local/lib/python3.10/lib-dynload', '/usr/local/lib/python3.10/site-packages'] Server time: Wed, 15 Dec 2021 18:58:25 +0900
該当のソースコード
python
1# app_api/views.py 2 3from rest_framework.views import APIView 4from rest_framework.response import Response 5 6from .models import ExampleModel 7from .serializer import ExampleSerializer 8 9from . import validation 10 11class Example(APIView): 12 def get(self, request): 13 example = ExampleModel.objects.all() 14 serializer = ExampleSerializer(example, many=True) 15 return Response(serializer.data) 16 17 def post(self, request): 18 response = { 19 "key" : request.data['key'] 20 } 21 22 return Response(response)
python
1# app_web/views.py 2 3from django.shortcuts import render 4import requests 5import json 6 7def index(request): 8 return render(request, 'web/index.html') 9 10def save(request): 11 data = { 12 'key' : request.POST['key'] 13 } 14 15 # ここでエラーが発生します 16 r = requests.post( 17 'http://localhost:9003/api/v1/', 18 headers = {'Content-Type': 'application/json'}, 19 data = json.dumps(data), 20 timeout = 1 21 ) 22 result = r.json() 23 24 context = { 25 'key' : result['key'] 26 } 27 28 return render(request, 'web/result.html', context)
試したこと
- localhostではなく、0.0.0.0や127.0.0.1でも試しましたが同様のエラーでした
- /etc/hostsにexample.com 127.0.0.1とし、http://example.com:9003として試しましたが同様のエラーでした
補足情報(FW/ツールのバージョンなど)
Python 3.10.1
Django 3.2
あなたの回答
tips
プレビュー