У меня есть служба API Django Rest Framework , которую я хочу повторно использовать в своем приложении внешнего интерфейса , но у меня есть некоторые сомнения относительно лучшего способа определения типа запроса, который получает конечная точка.
У меня есть структура, подобная приведенной ниже:
core
api
web
И я вызываю свои конечные точки из моего веб-приложения в мое приложение API.На данный момент я не использую никакой интерфейсной среды, только django, поэтому я отправляю данные из своего веб-приложения в API следующим образом: _customdictionary.custom_dictionary_kpi ({"language": 1, "user": 1}) , посмотрите, что в этом случае я не выполняю запрос POST, я просто отправляю словарь только с двумя значениями: language и user , которые я определил вмои сериализаторы:
serializers.py
class CustomDictionaryKpiSerializer(serializers.ModelSerializer):
class Meta:
model = CustomDictionary
fields = ('user','language')
web / views.py
class CustomDictionaryView(View):
def get(self, request, *args, **kwargs):
try:
_customdictionary = CustomDictionaryViewSet()
_customdictionary.custom_dictionary_kpi({"language": 1, "user": 1}) # Here i send my data
'''some logic'''
except Exception as e:
'''handle exception'''
return render(request,template_name='web/dictionary_get.html',status=self.code,context=self.response_data)
Затем я получаю данные в api / api.py с request ['field_name']
class CustomDictionaryViewSet(viewsets.ModelViewSet):
queryset = CustomDictionary.objects.filter(
is_active=True,
is_deleted=False
).order_by('id')
permission_classes = [
permissions.AllowAny
]
pagination_class = StandardResultsSetPagination
def __init__(self,*args, **kwargs):
self.response_data = {'error': [], 'data': {}}
self.code = 0
def get_serializer_class(self):
if self.action == 'custom_dictionary_kpi':
return CustomDictionaryKpiSerializer
return CustomDictionarySerializer
@action(methods=['post'], detail=False)
def custom_dictionary_kpi(self, request, *args, **kwargs):
try:
queryset = CustomDictionary.objects.filter(
is_active=True,
is_deleted=False,
language_id=request['language'],
user_id=request['user']
).order_by('id')
'''some logic'''
except Exception as e:
'''handle error'''
return Response(self.response_data,status=self.code)
Проблема заключается в том, что если я отправляю запрос POST в API DRF (форма HTML), перехватывая запрос, например: request ['field_name']
Не работает по причине:
*** TypeError: 'Request' object is not subscriptable
Работает с:
request.POST.get('<field_name>')
Или
request.data['<field_name>']
Получениепользователь или язык в типе Str.Аналогичная проблема возникает, если я отправляю данные в DFR API, но в необработанных данных он не работает с: request['field_name']
По причине:
*** TypeError: 'Request' object is not subscriptable
Ни с одним из них:
request.POST.get('<field_name>')
Поскольку его нет, он работает с:
request.data['<field_name>']
Получение пользователя или языка в типе Integer.Я знаю, что если я использую инфраструктуру веб-интерфейса, я мог бы отправить запрос на свою конечную точку и затем получить данные таким же образом, как DRF API:
request.POST.get('<field_name>')
или
request.data['<field_name>']
Я предполагаю, что мне нужен метод, который проверяет тип запроса, что-то вроде:
def validate(self,request):
try:
if request['field_name']:
'''some logic'''
except Exception as e:
if request.POST.get('field_name'):
'''some logic'''
Итак, есть ли элегантный способ проверки типа запроса?
Заранее спасибо залюбая помощь