【问题标题】:Django rest api custom class implementationDjango rest api 自定义类实现
【发布时间】:2020-12-06 22:39:33
【问题描述】:

我创建了一个类,用于从 farsecret API 中检索有关特定食品的数据。 在课堂上,我创建了 3 个函数:

*获得授权

*获取我们正在寻找的项目的ID

*下载项目数据

class IngredientImport(APIView):

def get_authorization_token(self):
    request_token_url = "https://oauth.fatsecret.com/connect/token"
    consumer_key = os.environ.get('NTS_Client_ID')
    consumer_secret = os.environ.get('NTS_Client_Secret')
    data = {'grant_type':'client_credentials', "scope":"basic"}

    access_token_response = requests.post(
        request_token_url, 
        data=data, 
        verify=False, 
        allow_redirects=False, 
        auth=(consumer_key, consumer_secret)
    )
    return access_token_response.json()["access_token"]


def get_list_by_name(self, name, access_token):
    api_url = "https://platform.fatsecret.com/rest/server.api"
    params={
        "method":"foods.search", 
        "search_expression":name, 
        "page_number":1, 
        "max_results":1, 
        "format":"json"
    }
    header = {"Authorization":access_token}
    api_call_headers = {"Authorization": "Bearer " + access_token}

    response = requests.get(
        api_url,
        params=params,
        headers=api_call_headers
    )
    items = response.json()["foods"]
    try:
        return response.json()["foods"]["food"]["food_id"]
    except KeyError:
        return None


def import_item(self, item_id, api_token):
    if item_id == None:
        return None

    api_url = "https://platform.fatsecret.com/rest/server.api"
    params={"method":"food.get", "food_id":item_id, "format":"json"}
    api_call_headers = {"Authorization": "Bearer " + access_token}  

    response = requests.get(
        api_url,
        params=params,
        headers=api_call_headers
    )
    item = response.json()["food"]["servings"]["serving"]
    item_name = response.json()["food"]["food_name"]
    if type(item) == list:
        item = item[0]
    try:
        portion_size = float(item["metric_serving_amount"])
        carbs = round(float(item["carbohydrate"]) / portion_size * 100, 2)
        fats = round(float(item["fat"]) / portion_size * 100, 2)
        proteins = round(float(item["protein"]) / portion_size * 100, 2)            
    except KeyError:
        return None

如何在我的应用程序中实现这个类,以避免在 urls.py 中为每个函数创建 3 个不同的路径。有可能还是应该将其分解为基于函数的视图?

【问题讨论】:

    标签: django rest django-class-based-views


    【解决方案1】:
    class IngredientImport(APIView):
    
        def get_authorization_token(self):
           ...
     
        def get_list_by_name(self, name, access_token):
           ...
    
        def import_item(self, item_id, api_token):
           ...
    
        def get(self, request):
           # get name from query param
           name = self.request.GET.get('name')
    
           token = self.get_authorization_token()
           food_list = self.get_list_by_name(name, token)
    
           for food_id in food_list:
               self.import_item(food_id, token)
    
           return Response({'imported_foods': food_list})
    

    然后,在您的 urls.py 上:

    urlpatterns = [
       path('import_foods', IngredientImport.as_view())
    ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-03
      • 2015-06-05
      • 2016-08-20
      相关资源
      最近更新 更多