Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django rest框架&;外部api_Django_Django Rest Framework - Fatal编程技术网

Django rest框架&;外部api

Django rest框架&;外部api,django,django-rest-framework,Django,Django Rest Framework,我想从外部API()获取数据。我可以像这样构建我的url.py吗 url(r'^(?P<test.com/consumers)>[0-9]+)$/', views.get, name="get"), url(r'^(?P[0-9]+)$/,views.get,name=“get”), 或者你还有其他好主意吗 谢谢 我认为最好创建自己的url端点,该端点映射到向外部API发出请求的视图 # urls.py url(r'^external-api/$', external_api_v

我想从外部API()获取数据。我可以像这样构建我的url.py吗

url(r'^(?P<test.com/consumers)>[0-9]+)$/', views.get, name="get"),
url(r'^(?P[0-9]+)$/,views.get,name=“get”),
或者你还有其他好主意吗


谢谢

我认为最好创建自己的url端点,该端点映射到向外部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)
#url.py
url(r“^external api/$”,外部api视图)
#views.py
导入请求
导入时间
从rest\u框架导入状态
来自rest\u framework.response导入响应
MAX_RETRIES=5#我们想尝试的任意次数
def外部api视图(请求):
如果request.method==“GET”:
尝试次数_num=0#记录我们重试的次数
当尝试次数<最大重试次数时:
r=请求。获取(“https://example.com/consumers,超时=10)
如果r.status_code==200:
data=r.json()
返回响应(数据,状态=status.HTTP\u 200\u OK)
其他:
尝试次数_num+=1
#您可能可以使用记录器在此处记录错误
时间。睡眠(5)#等待5秒钟再重试
返回响应({“error”:“Request failed”},status=r.status\u code)
其他:
返回响应({“error”:“methodnotallowed”},status=status.HTTP\u 400\u BAD\u请求)

只是一个例子。您也可以将其作为基于类的视图来执行。

无论您试图实现什么,此代码都无法工作

首先,
?p
构造只是一种为组指定符号名的方法。并且它不接受字符“.”、“/”和“')。所以正确的名字应该是
?P

其次,即使您纠正了正则表达式中的错误(例如
r'^(?p[0-9]+$)/“
),它也只会匹配任何URL,如
YOURDOMAIN.COM/


我建议您先学习。

您应该为外部API调用设置超时限制,否则您的视图可能会在几分钟内阻止其他传入请求。感谢@ToanNguyen指出这一点,我添加了一个超时并包含了最大重试次数Hanks@ThomasJiang,我将这样尝试,然后我将实现基于类的视图。感谢您在哪里提供用户名和密码以连接外部API?