“日常研究”之 respage02:共享單車資料介面化
由於我們使用了多程序的方式做 spiker,所以就不能直接使用如下方式來入庫了
python spiker.py | python xxx | python yyy && python redisToMysql.py 複製程式碼
只能在通過整個主程序結束之後,通過獲取主程序的返回結果來決定是否做入庫操作:
python spiker.py | python format.py | python writeToRedis.py if [ "$?" == "0" ]; then python redisToMysql.py fi 複製程式碼
入庫後的格式儘量簡單:
mysql> select * from respage02; +-----+------------+------------+-------------+--------------+-------+------+ | id| bikeid| day| lat| lng| time| type | +-----+------------+------------+-------------+--------------+-------+------+ |1 | 8620750656 | 2018-11-07 | 29.04729065 | 119.64855231 | 14:56 | mb| |2 | 8620762418 | 2018-11-07 | 29.04842459 | 119.64730693 | 14:56 | mb| |3 | 8620663052 | 2018-11-07 | 29.08465714 | 119.66206422 | 16:53 | mb| 複製程式碼
介面化
還是在 respage01 的 django 專案上直接新增介面便可。
新增 URL
urlpatterns = [ url(r'v1/respage01/$', views.Respage01.as_view(), name='Respage01'), url(r'v1/respage02/$', views.Respage02.as_view(), name='Respage02'), ] 複製程式碼
新增 model
class Respage02Info(models.Model): """ respage 02 相關的資料 """ time = models.CharField(max_length=100) day = models.CharField(max_length=100) bikeid = models.CharField(max_length=200) lat = models.FloatField() lng = models.FloatField() type = models.CharField(max_length=100) class Meta: db_table = "respage02" 複製程式碼
新增序列化
class Respage02Serializer(serializers.HyperlinkedModelSerializer): """ 序列化Respage02相關的資料 """ class Meta: model = Respage02Info fields = ('time', 'lat', 'lng', 'bikeid', 'type', 'day') 複製程式碼
新增業務邏輯 (view)
class Respage02(APIView): """ 獲取respage02相關的資料 """ authentication_classes = [] permission_classes = [] def get(self, request, format=None): req = request.query_params if 'type' not in req: return Response({}, status=status.HTTP_400_BAD_REQUEST) // 獲取某一天內最近時間點的最新資料 if req['type'] == 'now': if 'day' not in req: return Response({}, status=status.HTTP_400_BAD_REQUEST) timelist = Respage02Info.objects.distinct().values("time").filter(day=req['day']).order_by('-time').all() now = timelist[0]['time'] queryset = Respage02Info.objects.filter(day=req['day']).filter(time=now) serializer = Respage02Serializer(queryset, many=True) // 獲取某一天內的所有時間點列表 if req['type'] == 'timelist': if 'day' not in req: return Response({}, status=status.HTTP_400_BAD_REQUEST) timelist = Respage02Info.objects.distinct().values("time").filter(day=req['day']).order_by('time').all() return Response(timelist, status=status.HTTP_200_OK) // 獲取某一天內某一時間點的單車分佈資料 if req['type'] == 'location': if 'day' not in req or 'time' not in req: return Response({}, status=status.HTTP_400_BAD_REQUEST) queryset = Respage02Info.objects.filter(day=req['day']).filter(time=req['time']) serializer = Respage02Serializer(queryset, many=True) return Response(serializer.data, status=status.HTTP_200_OK) 複製程式碼