[Django]-Django rest framework & external api

12๐Ÿ‘

โœ…

I think it would be better to create your own url endpoint that maps to a view which makes a request to the external API.

# urls.py
url(r'^external-api/$', external_api_view)

# views.py
import requests
import time
from rest_framework import status
from rest_framework.response import Response

MAX_RETRIES = 5  # Arbitrary number of times we want to try

def external_api_view(request):
    if request.method == "GET":
        attempt_num = 0  # keep track of how many times we've retried
        while attempt_num < MAX_RETRIES:
            r = requests.get("https://example.com/consumers", timeout=10)
            if r.status_code == 200:
                data = r.json()
                return Response(data, status=status.HTTP_200_OK)
            else:
                attempt_num += 1
                # You can probably use a logger to log the error here
                time.sleep(5)  # Wait for 5 seconds before re-trying
        return Response({"error": "Request failed"}, status=r.status_code)
    else:
        return Response({"error": "Method not allowed"}, status=status.HTTP_400_BAD_REQUEST)

Just an example. You can do it as a class-based view as well.

๐Ÿ‘คThomas Jiang

0๐Ÿ‘

Whatever you are trying to achieve, this code will not work.

Firstly, ?P<name> construct is just a way to give a symbolic name to a group. And it does not accept characters โ€˜.โ€™, โ€˜/โ€™ and โ€˜)โ€™. So correct name would be something like ?P<consumer_id>.

Secondly, even after you correct mistakes in the regular expression (like this, for example r'^(?P<consumer_id>[0-9]+$)/'), it will just match any URL like YOURDOMAIN.COM/<integer_number>/.

I suggest you learn how regular expressions work in Python first.

๐Ÿ‘คAndriy Makukha

Leave a comment