如何仅在 Django Rest Framework 中的另一个 API 方法中调用 API POST 方法

Posted

技术标签:

【中文标题】如何仅在 Django Rest Framework 中的另一个 API 方法中调用 API POST 方法【英文标题】:How to call an API POST method only inside another API method in Django Rest Framework 【发布时间】:2022-01-23 10:57:28 【问题描述】:

我正在通过 DRF,我想在另一个也有 get 和 post 方法的 API 函数中调用一个具有 GET 和 POST 方法的 API 函数。是否会同时调用 get 和 post 方法,或者我能以任何方式实现它。我在谷歌上搜索我没有得到任何合适的方法

如果有人可以证明它会有所帮助。如果我想在另一个函数中调用 POST 方法怎么办?

views.py

startshift

@api_view(['GET']) 
def UserStartShift(request):


    if request.method == 'POST':
     
               UserId = request.data.get('UserId')
               Ip = request.data.get('Ip')
               PortNumber = request.data.get('PortNumber')
               print("UserId-->", UserId)
               print("Ip-->", Ip)
               print('Portnumber-->', PortNumber)


               cursor = connection.cursor()
               cursor.execute('EXEC [dbo].[Usp_StartShift]  @UserId=%s, @IP=%s, @Port=%s', (UserId,  Ip, PortNumber,))
     
               return Response(True, status=status.HTTP_200_OK)

endshift

@api_view(['GET']) 
def UserStopShift(request, UserId):
    try:
        users = tblUserShiftDetails.objects.filter(UserId=UserId)
    except tblUserShiftDetails.DoesNotExist:
        return Response(status=status.HTTP_404_NOT_FOUND)

    if request.method == 'GET':
        cursor = connection.cursor()
        cursor.execute('EXEC [dbo].[USP_StopShift] @UserId=%s',(UserId,))
       
        return Response(True)
 
    

#UserShiftDetailsView

 @api_view(['GET'])
def UserShiftDetailsView(request, userid):

    try:
        users = tblUserShiftDetails.objects.filter(UserId=userid)
    except tblUserShiftDetails.DoesNotExist:
        return Response(status=status.HTTP_404_NOT_FOUND)

    if request.method == 'GET':

        if UserStartShift == True: 
            cursor = connection.cursor()
            cursor.execute('EXEC [dbo].[USP_GetCurrentShiftDetails] @UserId=%s',(userid,))
            result_set = cursor.fetchall()
         
            for row in result_set:
                row = row[0]
            return Response("IsStarted":True,"EstimatedShifEnd":(row + datetime.timedelta(hours=9)).strftime('%d-%m-%Y %H:%M  %p'),"ReasonforAccess": "null")
      
        elif UserStopShift == True :
            cursor = connection.cursor()
            cursor.execute('EXEC [dbo].[USP_GetCurrentShiftDetails] @UserId=%s',(userid,))
            result_set = cursor.fetchall()
          
            for row in result_set:
                row = row[0]
            return Response("IsStarted":False,"EstimatedShifEnd":"null","ReasonforAccess": "null")

【问题讨论】:

您想发布到第三方 API 还是您的 API? 到我创建的API函数 然后你可以像在 Python 中那样调用它。您可能会发现从视图本身中提取功能很有帮助,因此共享代码会更容易。 我在这里添加了代码,其中 UserStartShift 和 UserStopShift 这些是我创建的 API 函数,每当用户开始换班时,它将返回特定的响应,同样适用于停止换档。在这里,我有条件方法,但没有成功。有什么方法可以尝试 【参考方案1】:

你可以试试这个

使用python请求https://docs.python-requests.org/en/latest/

import requests

class MyAPIOne(APIView):

    # headers

    def get(self, request, *args, **kwargs):

        # call another api for GET
        url = '/url-second-api-url'
        api_call = requests.get(url, headers=)
        print(api_call.json())

        # call another api for POST
        url = '/url-second-api-url'
        data =  # post data
        api_call = requests.get(url, headers=, data=data)
        print(api_call.json())

        return Response()

【讨论】:

谢谢,但是我不能像在普通 python 中那样只调用方法名而不是调用 url 那么您需要创建一个独立的方法,然后将该方法调用到 API 中 我在这里添加了代码,其中 UserStartShift 和 UserStopShift 这些是我创建的 API 函数,每当用户开始换班时,它将返回特定的响应,同样适用于停止换档。在这里,我有条件方法,但没有成功。有什么方法可以尝试 我已经使用函数 API 视图创建 你不能在没有任何 URL 的情况下调用 Django 函数。创建一个独立的函数

以上是关于如何仅在 Django Rest Framework 中的另一个 API 方法中调用 API POST 方法的主要内容,如果未能解决你的问题,请参考以下文章