【问题标题】:How to call django class based view get function from normal function?如何从普通函数调用基于 django 类的视图获取函数?
【发布时间】:2020-02-06 20:30:35
【问题描述】:

我想得到基于类的视图中存在的 get 函数的响应。所以我写了一个类范围之外的小函数。如何将 URL 传递给此 get 函数或如何直接调用此函数以获取其响应? 该函数将从模板中获取值,并且需要将获取的参数值传递给 Get_data 中的函数。 Get_data 类目前用于直接从调用的 URL 获取值并给出 json 响应,我想扩展它的功能,我希望从模板获取值并将其传递给这个 Get_data 函数并获取它的响应。

示例代码:

class Get_data(APIView):

   def get(self, request):
       username = request.GET.get('username')
       # Processing Code #

       response_data = {'status': 'SUCCESS',
                     'data': XYZ}
       return Response(response_data, status=status.HTTP_200_OK)

def fetch_value():
    # Code to get response data from GET function of class Get_data by passing GET parameter value

#

那么函数 fetch_value 中的代码应该是什么来传递从模板中获取的值并从 Get_data 类的 GET 函数中获取响应数据?

【问题讨论】:

  • 这里没有请求对象?
  • 这听起来像是一个 XY 问题(问错了问题),你为什么要首先这样做?在更高的层次上解释 fetch_value() 应该实现什么,即你将如何使用该功能。
  • 请解释你为什么要这样做——你为什么要写这个fetch_value()函数以及你将如何使用它。除非您尝试为您的视图编写测试(在这种情况下有现有工具),否则正确的解决方案很可能是从您的 get() 方法中提取您感兴趣的代码到您的不同函数或方法中可以从两个点呼叫。

标签: django python-3.x django-models django-rest-framework


【解决方案1】:

您可以使用.as_view(),然后“发送”请求:

def fetch_value(request):
    response = Get_data.as_view()(request)
    # …

这将返回一个HttpResponse object [Django-doc],然后您可以检查它,例如它的.content attribute [Django-doc]

话虽如此,为什么不将Get_data.as_view() 结果添加到urls.py 中?处理响应通常不是一个好主意,因为那时已经丢失了很多“上下文”。

【讨论】:

    【解决方案2】:

    您可以使用以下代码:

    from rest_framework.request import HttpRequest, Request
    
    
    def fetch_value():
        obj = Get_data()
        # make http request object
        http_request_obj = HttpRequest()
        # make http request object
        request = Request(http_request_obj)
        query_output_data = obj.get(request)
    

    【讨论】:

    • 如何将 URL 传递给请求对象以便我得到它的响应?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 2012-10-23
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    相关资源
    最近更新 更多