Django代码中的逻辑问题,从Redis和数据库读取数据

mfpqipee  于 9个月前  发布在  Redis
关注(0)|答案(1)|浏览(73)

我有这个django代码,它通过inscode从redis获取数据并返回。如果redis关闭了,它应该跳出try,expect block并从数据库(postgresql)读取数据。

class GetOrderBook(APIView):
    def get(self, request, format=None):
        # get parameters
        inscode = None
        if 'i' in request.GET:
            inscode = request.GET['i']

        if inscode != None:
            try:
                #raise ('disabling redis!')
                r_handle = redisconnection

                data = r_handle.get(inscode)

                if data != None:
                    return Response(200)
                else:
                    print('not found in cache')
            except BaseException as err:
                print(err)
            orderbook = OrderBook.objects.filter(
                symbol__inscode=inscode).order_by('rownum')
            if len(orderbook) > 0:
                data = OrderBookSer(orderbook, many=True).data
                data_formatted = {'buynum': [0]*5, 'buyvol': [0]*5, 'buyprice': [
                    0]*5, 'sellnum': [0]*5, 'sellvol': [0]*5, 'sellprice': [0]*5}
                

                return Response(data_formatted, status=status.HTTP_200_OK)
            else:
                return Response({'Bad Request'}, status.HTTP_404_NOT_FOUND)
        return Response({'Bad Request'}, status.HTTP_400_BAD_REQUEST)

但问题是,它不从数据库阅读,我也写了这个测试,它返回200,如果你读数据。但是当Redis关闭时,它不会读数据,并返回404给我。

def test_redis_function(self, api_client, test_user):
    url = self.url
    api_client.force_authenticate(user=test_user)  
    
    response = api_client.get(url, {'i': '2400322364771558'}) 
    assert response.status_code == status.HTTP_200_OK

如果你能帮我我会很高兴的

v6ylcynt

v6ylcynt1#

pytest和django一起为你的测试创建了新的测试数据库,看起来你忘记在开始这个测试之前创建OrderBook类的对象了。为您的测试添加设置功能,或者只是添加类似于

symbol = Symbol.objects.create(inscode=2400322364771558)
OrderBook.objects.create(symbol=symbol)

在API_client调用之前。
但更好的做法-使用Django Factory Boy https://factoryboy.readthedocs.io/en/stable/orms.html

相关问题