Add detailed logging for registration debugging

- Added logging in RegisterAPIView to track incoming data and validation errors
- Added logging in register_view to track form data and API communication
- Created test_register_api.py script for testing registration API
- Logs include: POST data, Content-Type, validation errors, API payload and responses
- All logs use [REGISTER] and [REGISTER_VIEW] prefixes for easy filtering
This commit is contained in:
admin i 2025-11-21 13:35:38 +03:00
parent 74862be3c3
commit f27ebd9f29
3 changed files with 174 additions and 0 deletions

View File

@ -300,12 +300,20 @@ class RegisterAPIView(APIView):
@transaction.atomic
def post(self, request):
import logging
logger = logging.getLogger(__name__)
# Логируем входящие данные для диагностики
logger.warning(f"[REGISTER] Received data: {request.data}")
logger.warning(f"[REGISTER] Content-Type: {request.content_type}")
# 0) хотя бы один контакт
if not (
request.data.get("telegram")
or request.data.get("whatsapp")
or request.data.get("wechat")
):
logger.warning("[REGISTER] No contact provided")
return Response(
{
"detail": "Заполните хотя бы одно из полей: WhatsApp, WeChat или Telegram"
@ -314,6 +322,8 @@ class RegisterAPIView(APIView):
)
ser = RegisterSerializer(data=request.data)
if not ser.is_valid():
logger.warning(f"[REGISTER] Validation errors: {ser.errors}")
ser.is_valid(raise_exception=True)
v = ser.validated_data

View File

@ -65,6 +65,9 @@ def register_view(request):
Страница регистрации: показываем Django-форму и шлём валидные данные в /api/v1/auth/register/
(аватар пока локально, в API не отправляем — загрузим после верификации).
"""
import logging
logger = logging.getLogger(__name__)
api = get_api_client(request)
if request.method == "GET":
@ -73,11 +76,24 @@ def register_view(request):
# ВАЖНО: учитывать файлы (чтобы form.avatar был BoundField)
form = RegistrationForm(request.POST, request.FILES)
# Логируем полученные данные
logger.warning(f"[REGISTER_VIEW] POST data: {request.POST.dict()}")
logger.warning(f"[REGISTER_VIEW] FILES: {list(request.FILES.keys())}")
if not form.is_valid():
logger.warning(f"[REGISTER_VIEW] Form errors: {form.errors}")
return render(request, "auth/register.html", {"form": form}, status=400)
payload = form.to_api_payload() # формирует json для API, включая password
logger.warning(f"[REGISTER_VIEW] API payload keys: {list(payload.keys())}")
payload_debug = {k: v for k, v in payload.items() if k != 'avatar'}
logger.warning(f"[REGISTER_VIEW] API payload (без avatar): {payload_debug}")
resp = api.post("v1/auth/register/", json=payload)
logger.warning(f"[REGISTER_VIEW] API response status: {resp.status}")
resp_data = resp.json if resp.json else resp.content
logger.warning(f"[REGISTER_VIEW] API response: {resp_data}")
if resp.status == 201:
messages.success(

View File

@ -0,0 +1,148 @@
#!/usr/bin/env python
"""
Тестовый скрипт для проверки API регистрации.
Отправляет запросы на /api/v1/auth/register/ и показывает ответы.
"""
import json
import sys
import os
import django
# Настройка Django
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "eusrr_backend.settings")
django.setup()
from django.test import Client
from django.urls import reverse
def test_register():
"""Тестируем регистрацию с валидными данными."""
client = Client()
url = reverse("api:v1:register")
# Тестовые данные
payload = {
"first_name": "Тест",
"last_name": "Тестов",
"phone_number": "+79991234567",
"email": "test@example.com",
"birth_date": "1990-01-01",
"password": "password123",
"telegram": "@test_user",
"whatsapp": "",
"wechat": "",
}
print(f"Отправка запроса на: {url}")
print(f"Данные: {json.dumps(payload, indent=2, ensure_ascii=False)}")
print("-" * 60)
response = client.post(
url,
data=json.dumps(payload),
content_type="application/json"
)
print(f"Статус: {response.status_code}")
print(f"Content-Type: {response.get('Content-Type')}")
try:
data = response.json()
print(f"Ответ: {json.dumps(data, indent=2, ensure_ascii=False)}")
except Exception as e:
print(f"Не удалось распарсить JSON: {e}")
print(f"Тело ответа: {response.content.decode('utf-8')}")
return response
def test_register_missing_contact():
"""Тестируем регистрацию без контактов."""
client = Client()
url = reverse("api:v1:register")
payload = {
"first_name": "Тест",
"last_name": "Тестов",
"phone_number": "+79991234567",
"email": "test2@example.com",
"birth_date": "1990-01-01",
"password": "password123",
"telegram": "",
"whatsapp": "",
"wechat": "",
}
print("\n" + "=" * 60)
print("Тест без контактов:")
print(f"Данные: {json.dumps(payload, indent=2, ensure_ascii=False)}")
print("-" * 60)
response = client.post(
url,
data=json.dumps(payload),
content_type="application/json"
)
print(f"Статус: {response.status_code}")
try:
data = response.json()
print(f"Ответ: {json.dumps(data, indent=2, ensure_ascii=False)}")
except Exception as e:
print(f"Не удалось распарсить JSON: {e}")
return response
def test_register_invalid_phone():
"""Тестируем регистрацию с неправильным телефоном."""
client = Client()
url = reverse("api:v1:register")
payload = {
"first_name": "Тест",
"last_name": "Тестов",
"phone_number": "123", # неправильный формат
"email": "test3@example.com",
"birth_date": "1990-01-01",
"password": "password123",
"telegram": "@test_user",
"whatsapp": "",
"wechat": "",
}
print("\n" + "=" * 60)
print("Тест с неправильным телефоном:")
print(f"Данные: {json.dumps(payload, indent=2, ensure_ascii=False)}")
print("-" * 60)
response = client.post(
url,
data=json.dumps(payload),
content_type="application/json"
)
print(f"Статус: {response.status_code}")
try:
data = response.json()
print(f"Ответ: {json.dumps(data, indent=2, ensure_ascii=False)}")
except Exception as e:
print(f"Не удалось распарсить JSON: {e}")
return response
if __name__ == "__main__":
print("=" * 60)
print("ТЕСТ API РЕГИСТРАЦИИ")
print("=" * 60)
test_register()
test_register_missing_contact()
test_register_invalid_phone()
print("\n" + "=" * 60)
print("Тесты завершены")
print("=" * 60)