如何从函数创建服务?

Posted

技术标签:

【中文标题】如何从函数创建服务?【英文标题】:How to create a service from a function? 【发布时间】:2021-12-06 08:46:16 【问题描述】:

我想使用 Django Rest API 创建一个服务。我有一个功能。这个函数的结果应该返回 2 个值,我应该以 JSON API 格式返回这些值。 该功能将像这样工作。我将接收features_list 作为参数,我将使用它来创建结果并在def prediction 函数中以json 格式将其显示为服务。

我创建了一个示例 API(我猜)它在我看来是 class PredictionSet,但我实际上想在我的视图中为 def prediction 函数提供服务。

我不明白如何应用它。我感到很困惑。任何帮助将不胜感激。

models.py

class Liquidity(models.Model):
    pred_y = models.CharField(max_length=600)
    score = models.FloatField()

views.py

class PredictionSet(viewsets.ModelViewSet):
    queryset = Liquidity.objects.all()
    serializer_class = LiquiditySerializer


def prediction(request, features_list):
    filename = config.FINAL_MODEL_PATH
    classifier = pickle.load(open(filename, 'rb'))
    scale_file = config.SCALER_PATH
    scaler = pickle.load(open(scale_file, 'rb'))

    sample = np.array(features_list).reshape(1, -1)
    sample_scaled = scaler.transform(sample)

    pred_y = classifier.predict(sample_scaled)
    prob_y = classifier.predict_proba(sample_scaled)
    if prob_y[0][1] < 0.5:
        score = 0
    elif prob_y[0][1] <= 0.69:
        score = 1
    else:
        score = 2
    pred_y = pred_y[0]

    prediction_obj = Liquidity.objects.get_or_create(pred_y=pred_y, score=score)
    prediction_result = prediction_obj.pred_y
    prediction_score = prediction_obj.score

    context = 
        'prediction_result ': prediction_result,
        'prediction_score ': prediction_score,
    

    return context

serializer.py

class LiquiditySerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Liquidity
        fields = '__all__'

【问题讨论】:

你想通过viewset返回函数prediction的结果吗? @Rvector 是的。 【参考方案1】:

如果您想从 DRF 中的 ModelViewset 返回自定义 JSON,您可以像这样覆盖 .list() 和/或 .retrieve()

from rest_framework import status
from rest_framework.response import Response

class PredictionSet(viewsets.ModelViewSet):
    queryset = Liquidity.objects.all()
    serializer_class = LiquiditySerializer
    
    # Your custom function definition
    def prediction(self, request, features_list):
        # The content
    
    def retrieve(self, request, *args, **kwargs):
        result = prediction(...)  # Call your custom service and got result
        # Return the result as JSON (url = /api/v1/predictions/1) an object
        return Response('data': result, status=status.HTTP_200_OK)
    
    def list(self, request, *args, **kwargs):
        result = prediction(...)  # Call your custom service and got result
        # Return the result as JSON (url = /api/v1/predictions) a list of objects
        return Response('data': result, status=status.HTTP_200_OK)

更多详情请关注this link

【讨论】:

def retrieve(self, request, *args, **kwargs): result = self.prediction(features_list) 我应该这样取参数吗? 如果prediction is a static method 那么是的,您可以删除selfrequest 参数。

以上是关于如何从函数创建服务?的主要内容,如果未能解决你的问题,请参考以下文章

aws 如何从生产环境中的 lambda 函数访问 ECS 服务

如何从 AWS Lambda 函数 + 无服务器框架的 URL 中删除阶段?

如何通过 JavaScript 从服务器端的网页调用客户端 C# 程序函数?

如何创建值数组并从 PHP 调用 JavaScript 函数

如何从函数对象创建本机协程?

如何从 plsql 函数创建和返回游标?