Achill
@Achill
Недопрограммист)))

Как обработать произвольный запрос к Django Rest Framework?

Стоит задача принять данные с Angular и их обработать неким образом (допустим отправить сообщение в телеграм. Проблема в том что толи HttpClient не посылает запрос толи Django его не возвращает.
Код отправки запроса Angular:
sendMessage(){
    if(this.reCaptchaRes!=null){
      alert("Сообщение отправлено в телеграм!")
      this.http.get('http://127.0.0.1:8000/api/v1/sendMessage/')
      .subscribe((responce)=>{
        console.log('Responce:')
        console.log(responce)
      })
    }
    else{
      alert("Вы должны пройти проверку reCaptcha")
    }
  }

Код обработки запроса Django:
from django.shortcuts import render
from django.http import JsonResponse
from rest_framework.response import Response
from rest_framework.views import APIView

class MessageView(APIView):
    def get(self, request):
        data=request.POST
        responce=dict(error=0, message="Message send", success=True)
        return Response(responce)

Прикол в том что через Url 127.0.0.1:8000/api/v1/sendMessage и через Postman ответ есть:
5e4ffe63a662a388590971.png
  • Вопрос задан
  • 56 просмотров
Пригласить эксперта
Ответы на вопрос 1
Achill
@Achill Автор вопроса
Недопрограммист)))
Может кому понадобится. Проблема была в csrf токене. Решил проблему но как по мне это костыль.
1 в файле урлов Api/urlls.py подключил csrf_exempt:
from django.urls import path, include
from django.views.decorators.csrf import csrf_exempt

from Sites.views import SiteListView
from .views import messagePost

app_name= 'Sites'
urlpatterns = [
    path('Site/all/', SiteListView.as_view()),
    path('sendMessage/', csrf_exempt(messagePost)),
]

В файле Api/views.py для обработки запроса сделал обычную функцию котораю получает данные из request.body в формате json и после обработки также возвращает json:
from django.shortcuts import render
import json
import requests

from django.http import JsonResponse
from rest_framework.response import Response

def messagePost(request):
    data = json.loads(request.body.decode())
    responce=dict(error=0, message="Message send", success=True)

    token = "TELEGRAM_TOKEN"
    url = "https://api.telegram.org/bot"
    channel_id = "CHAT_ID"
    url += token
    method = url + "/sendMessage"
    text="Имя: \n "+str(data.get('name'))+"\n Email: \n "+str(data.get('email'))+"\n Телефон:\n "+str(data.get('phone'))+"\n Сообщение:\n "+str(data.get('message'))

    r = requests.post(method, data={
         "chat_id": channel_id,
         "text": text
          })

    if r.status_code != 200:
        responce['error'] = 5
        responce['message']="Возникла ошибка"

    return JsonResponse(responce)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы