Как мне обработать еще один POST-запрос на моем сайте

Здравствуйте, у меня на сайте есть форма, которая отправляет POST-запрос на submit.

вот как я обрабатываю POST-запрос формы в своем представлении

def SignUp(request):
    
    if request.method == 'POST':

        stuff goes here

    else:
        form = SignUpForm()

    return render(request, "index.html", {"form": form})

Теперь в моем javascript я хочу добавить еще один POST-запрос, который будет проверять, не занято ли уже текущее имя пользователя в пределах определенного. Я сделал его и отправил POST в мое текущее представление, где оба этих POST-запроса будут обработаны вместе с POST-запросом формы. В итоге получается, что SignUp() продолжает обрабатывать оба POST-запроса. Как мне обработать два POST-запроса в одном представлении? Есть ли лучший способ сделать все это? (желательно, чтобы я оставался на этом url)

пытался прочитать о каком-либо способе различать POST-запросы, но ничего не нашел. (я начал изучать django всего несколько дней назад и совершенно потерялся, пытаясь заставить это работать)

Вам нужно использовать другой маршрут. URI используются для создания иерархических адресов конечных точек, на которых обрабатывается функциональность. Поскольку вы хотите использовать другой POST, вам нужно иметь другой маршрут, по которому он будет отправлен. Вот пример структуры маршрутизации (restful) для веб-интерфейса API для данных и пользователей.

Действия с данными

  • получить данные или создать новые данные
/api/data
- GET
- POST
  • получить часть данных, обновить их, удалить
/api/data/:id
-GET 
-PUT
-DELETE

Обработка действий пользователя

/api/user
-GET
-POST
/api/user/:id
-GET
-PUT
-DELETE

Обратите внимание, что в каждой конечной точке обрабатываются разные HTTP-глаголы (GET, PUT, POST, DELETE), но никогда дважды в одной конечной точке.

Я думаю, что Flask - лучшее место для начала знакомства с некоторыми из этих концепций. Вот статья в блоге о Flask и маршрутизации. https://auth0.com/blog/developing-restful-apis-with-python-and-flask/

Самым обычным способом является использование различных путей URL для каждого POST-запроса. Это означает, что для отправки формы регистрации используется один URL, а для проверки доступности имени пользователя - другой. (Рекомендую проверить поведение аналогичных веб-приложений с помощью инструментов разработчика -> вкладка Network, пока они выполняют аналогичные действия)

Лучшая практика и рекомендуемый способ: Использование разных URL для username_check :

В urls.py

from django.urls import path
from .views import SignUp, check_username

urlpatterns = [
    path('signup/', SignUp, name='signup'),
    path('check_username/', check_username, name='check_username'),
]

В файле views.py

def check_username(request):
    if request.method == 'POST':
        # Handle the username check
        ...

Если вы все еще хотите сделать это в одном и том же URL, это не лучшая практика, но это возможно, если проверить содержимое request.POST. Например, если при проверке имени пользователя отправляется только имя пользователя, а при регистрации - другие поля, такие как email и пароль, вы можете сделать так:

def SignUp(request):
    if request.method == 'POST':
        if 'username' in request.POST and 'email' not in request.POST:
            # This must be the username check
            ...
        else:
            # This must be the sign-up form
            ...
    else:
        form = SignUpForm()

    return render(request, "index.html", {"form": form})

Напоследок я рекомендую изучить имплантирование представлений API, структуру REST и Django Rest Framework в качестве пути обучения для такого рода "фоновых" возможностей.

Если вам нужно знать, занято имя пользователя или нет, вы можете просто переопределить метод clean вашей формы:

    class SignUpForm(UserCreationForm):
    ...

        def clean_username(self):
            username = self.cleaned_data['uesrname']
            if User.objects.filter(username=username).exists():
                raise ValidationError("Email already exists")
            return email

check this > https://docs.djangoproject.com/en/4.2/ref/forms/validation/

btw Лучший способ сохранить уникальность поля - поместить unique=True в поле модели. Надеюсь, это помогло.

Вы можете просто задать дополнительные параметры в полезной нагрузке, чтобы различать почтовые запросы.

Например, в файле views.py вы можете задать дополнительный параметр signup как часть полезной нагрузки:

if request.method == "POST":
    signup = request.POST.get('signup', 'normal'):
    if signup == 'normal':
       # implement normal signup logic..
    else:
       # implement custom logic

В вашем шаблоне обязательно добавьте signup в качестве атрибута формы со значением по умолчанию normal в данном случае. Включите его также в любые вызовы javascript в представлении. Затем вы можете реализовать любые другие условия if в вашем представлении.

Вернуться на верх