1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| import sys import json import pandas as pd from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status from rest_framework import serializers from KMRobot import KMRobot
def decode_unicode(obj): ''' 把字典中的 unicode 字符解码成正常字符 ''' if isinstance(obj, str): return eval(repr(obj)) elif isinstance(obj, list): return [decode_unicode(item) for item in obj] elif isinstance(obj, dict): return {decode_unicode(k): decode_unicode(v) for k, v in obj.items()} return obj
class MySerializer(serializers.Serializer): '''数据验证''' token = serializers.CharField(max_length=100) data = serializers.JSONField()
def validate_name(self, value): if value != 'token': raise serializers.ValidationError("token is invalid!") return value
def validate_data(self, value): value = decode_unicode(value) try: df = pd.DataFrame(value) except Exception: raise serializers.ValidationError("Data must be a JSON object") cols = ["id", "category", "content", "answer", "keyword", "suggestsList"] if list(df.columns) != cols: raise serializers.ValidationError( f"columns must be: {' '.join(cols)}") return df
def addfaq(df: pd.DataFrame): '''添加知识库问题,如果已有id则不添加''' t = KMRobot() t.faqlist2mysql() df = df[(df['category'] != "") & ( df['content'] != "") & (df['answer'] != "")] for v in range(2, len(df)): if df.iloc[v, 0] == "": keyword = None if df.iloc[v, 4] == "" else df.iloc[v, 4] suggestsList = None if df.iloc[v, 5] == "" else df.iloc[v, 5] category = df.iloc[v, 1] content = df.iloc[v, 2] answer = df.iloc[v, 3] id = t.addfaq(category=category, content=content, answer=answer, keyword=keyword, suggestsList=suggestsList) df.iloc[v, 0] = id t.faqlist2mysql() return df
class MyAPIView(APIView): def post(self, request): serializer = MySerializer(data=request.data) if serializer.is_valid(): data = serializer.validated_data["data"] data = addfaq(data) return Response({'status': 'success', 'data': data}) return Response({'status': 'error', 'errors': serializer.errors}, status=status.HTTP_400_BAD_REQUEST)
|