@zlodiak

Как обработать OPTION-запрос?

Есть бекенд на django. Фронтенд находится на другом домене. С фронта приходит кроссдоменный запрос с POST-параметрами. Помогите пожалуйста получить эти параметры в view и, например, вывести в консоль.

from django.shortcuts import render
from django.contrib.auth.models import User
from django.http import JsonResponse

view:
def registration(request):
    print('----', request.POST)
    print('----', request.POST.get('username'))
    username = request.POST['username']
    email = request.POST['email']
    password = request.POST['password']

    print(username, email, password)

    if _reg_data_exist(username, email, password):
        user = User.objects.create_user(username, email, password)
        user.save()

    response = JsonResponse([{"registration_successful": True}], safe=False)
    response['Access-Control-Allow-Origin'] = '*'
    response['Access-Control-Allow-Methods'] = 'POST'
    return response

def _reg_data_exist(username, email, password):
    is_exist = True
    if len(username.strip()) == 0: is_exist = False
    if len(email.strip()) == 0: is_exist = False
    if len(password.strip()) == 0: is_exist = False
    return is_exist


Проблема в том, что кроссдоменные запросы состоят из двух запросов. Сначала отправляется OPTION-запрос, а затем основной. В моём случае view прерывает работу django при получении OPTION-запроса:
System check identified no issues (0 silenced).
June 25, 2019 - 12:09:59
Django version 2.2, using settings 'run_res.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
---- <QueryDict: {}>
---- None
Internal Server Error: /app_auth/registration
Traceback (most recent call last):
  File "/home/kalinin/django/run_res/venv/lib/python3.6/site-packages/django/utils/datastructures.py", line 78, in __getitem__
    list_ = super().__getitem__(key)
KeyError: 'username'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/kalinin/django/run_res/venv/lib/python3.6/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/home/kalinin/django/run_res/venv/lib/python3.6/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/kalinin/django/run_res/venv/lib/python3.6/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/kalinin/django/run_res/app_auth/views.py", line 9, in registration
    username = request.POST['username']
  File "/home/kalinin/django/run_res/venv/lib/python3.6/site-packages/django/utils/datastructures.py", line 80, in __getitem__
    raise MultiValueDictKeyError(key)
django.utils.datastructures.MultiValueDictKeyError: 'username'
[25/Jun/2019 12:10:04] "OPTIONS /app_auth/registration HTTP/1.1" 500 76427


Со стороны фронта запрос выглядит так:
5d121131b5127026047629.png
  • Вопрос задан
  • 339 просмотров
Решения вопроса 1
alternativshik
@alternativshik
response['Access-Control-Allow-Methods'] = 'GET'
разрешаете ГЕТ, а шлете пост
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы