如何从外部 API 获取数据到 Django Rest Framework

Mar*_*jch 3 api django rest django-rest-framework

我正在创建一个 DRF 项目(仅限 API),其中登录用户可以指定他想要接收多少人随机生成的凭据。

我的问题是:我想从外部 API ( https://randomuser.me/api ) 获取这些凭据。该网站会生成 URL 的“结果”参数中指定数量的随机用户数据。前任。https://randomuser.me/api/?results=40

我的问题是:

我怎样才能获得这些数据?我知道 JavaScript fetch() 方法可能有用,但我实际上不知道如何将它与 Django Rest Framework 连接,然后操作它。我想在用户发送 POST 请求后向用户显示数据(仅指定要生成的用户数量),并将结果保存在数据库中,以便他稍后可以访问它们(通过 GET 请求)。

如果您有任何想法或建议,我将非常感激。

谢谢你!

Rve*_*tor 6

以下是如何在 Django Rest Framework API 视图中进行 API 调用:

因为您想将外部 API 请求存储在数据库中。这是存储用户结果的模型示例。

模型.py

from django.conf import settings

class Credential(models.Models):
    """ A user can have many generated credentials """
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    value = models.CharField()

    # Here we override the save method to avoid that each user request create new credentials on top of the existing one
    
    def __str__(self):
        return f"{self.user.username} - {self.value}"
Run Code Online (Sandbox Code Playgroud)

视图.py

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
# Assume that you have installed requests: pip install requests
import requests
import json

class GenerateCredential(APIVIew):
    """ This view make and external api call, save the result and return 
        the data generated as json object """
    # Only authenticated user can make request on this view
    permission_classes = (IsAuthenticated, )
    def get(self, request, format=None):
        # The url is like https://localhost:8000/api/?results=40
        results = self.request.query_params.get('type')
        response = {}
        # Make an external api request ( use auth if authentication is required for the external API)
        r = requests.get('https://randomuser.me/api/?results=40', auth=('user', 'pass'))
        r_status = r.status_code
        # If it is a success
        if r_status = 200:
            # convert the json result to python object
            data = json.loads(r.json)
            # Loop through the credentials and save them
            # But it is good to avoid that each user request create new 
            # credentials on top of the existing one
            # ( you can retrieve and delete the old one and save the news credentials )
            for c in data:
                credential = Credential(user = self.request.user, value=c)
                credential.save()
            response['status'] = 200
            response['message'] = 'success'
            response['credentials'] = data
        else:
            response['status'] = r.status_code
            response['message'] = 'error'
            response['credentials'] = {}
        return Response(response)


class UserCredentials(APIView):
    """This view return the current authenticated user credentials """
    
    permission_classes = (IsAuthenticated, )
    
    def get(self, request, format=None):
        current_user = self.request.user
        credentials = Credential.objects.filter(user__id=current_user)
        return Response(credentials)
Run Code Online (Sandbox Code Playgroud)

注意:这些视图假设user发出请求的人已通过身份验证,更多信息请参见此处。因为我们需要用户将检索到的凭据保存在数据库中。

urls.py

path('api/get_user_credentials/', views.UserCredentials.as_view()),
path('api/generate_credentials/', views.GenerateCredentials.as_view()),
Run Code Online (Sandbox Code Playgroud)

.js

const url = "http://localhost:8000/api/generate_credentials/";
# const url = "http://localhost:8000/api/get_user_credentials/";

fetch(url)
.then((resp) => resp.json())
.then(function(data) {
    console.log(data);
})
.catch(function(error) {
    console.log(error);
});
Run Code Online (Sandbox Code Playgroud)