POST-запрос с ajax не работает после установки django hosts

Здравствуйте, я только начинаю знакомиться с django hosts, который я пытаюсь установить на сайте электронной коммерции, который я создаю.

Итак, в основном у меня будет основной сайт - www.shop.com

И я хочу иметь поддомен - sell.shop.com - на котором продавцы смогут зарегистрироваться и получить доступ к своей приборной панели.

Ранее я устанавливал сайт продавца на www.shop.com/sell, что, на мой взгляд, неправильно.

Когда продавец регистрировался, я обрабатывал валидацию формы с помощью AJAX. И все работало правильно.

После установки django hosts и перенастройки приложения я заметил, что AJAX POST запрос больше не определяется. Таким образом, данные не сохраняются в БД и валидация на форме не работает.

settings.py

ALLOWED_HOSTS = ['127.0.0.1', 'www.shop.com', '.shop.com',]

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',

# Third Party
'django_hosts',
'corsheaders',

# Custom
'pages',
'users',
'vendors',
]

MIDDLEWARE = [
'django_hosts.middleware.HostsRequestMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django_hosts.middleware.HostsResponseMiddleware'
]

ROOT_URLCONF = 'sns.urls'
ROOT_HOSTCONF = 'sns.hosts'
DEFAULT_HOST= 'www'
PARENT_HOST = 'surfnshop.mu'
HOST_PORT = '8009'

CORS_ALLOWED_ORIGINS = [
    "http://surfnshop.mu:8009",
    "http://sell.surfnshop.mu:8009"
]

CORS_ALLOW_METHODS = (
    'DELETE',
    'GET',
    'OPTIONS',
    'PATCH',
    'POST',
    'PUT',
)

CORS_ALLOW_HEADERS = (
    'accept',
    'accept-encoding',
    'authorization',
    'content-type',
    'dnt',
    'origin',
    'user-agent',
    'x-csrftoken',
    'x-requested-with',
)

SECURE_CROSS_ORIGIN_OPENER_POLICY = None

Регистрационная форма (html)

<form id="vendorRegForm1" action="{% host_url 'create_vendor_account' host 'sell' %}" method="POST" data-url="{% url 'create_vendor_account' %}">
                {% csrf_token %}
                <div class="row">
                    <div class="col-md-12">
                        <label for="first_name">First Name:</label>
                        <input type="text" name="first_name" class="form-control" required>
                    </div>
                </div>

                <div class="row mt-3">
                    <div class="col-md-12">
                        <label for="last_name">Last Name:</label>
                        <input type="text" name="last_name" class="form-control" required>
                    </div>
                </div>

                <div class="row mt-3">
                    <div class="col-md-12">
                        <label for="email">Email:</label>
                        <input type="email" name="email" class="form-control" required>
                    </div>
                </div>

                <div class="row mt-3">
                    <div class="col-md-12">
                        <label for="password">Password:</label>
                        <input type="password" name="password" class="form-control" required>
                    </div>
                </div>

                <div class="row mt-3">
                    <div class="col-md-12">
                        <label for="password2">Confirm Password:</label>
                        <input type="password" name="password2" class="form-control" required>
                    </div>
                </div>

                <div class="text-center mt-3">
                    <button id="vendorRegForm1Btn" type="button" class="btn btn-sm btn-blue">
                        <span id="CreateVendorAccount">Create Account</span>
                    </button>
                </div>
                
            </form>

Views.py

def createVendorAccount(request):

    form = RegisterVendorForm()
    if request.method == "POST":
        password2 = request.POST.get('password2')
        form = RegisterVendorForm(request.POST)
        if form.is_valid():
        
            form.first_name = form.cleaned_data['first_name']
            form.last_name = form.cleaned_data['last_name']
            form.email = form.cleaned_data['email']
            form.password = form.cleaned_data['password']

            if len(form.first_name) == 0:
                return JsonResponse({'status': 'FIRST NAME MISSING',}, safe=False)
            if len(form.last_name) == 0:
                return JsonResponse({'status': 'LAST NAME MISSING',}, safe=False)
            if len(form.email) == 0:
                return JsonResponse({'status': 'EMAIL MISSING',}, safe=False)
            if len(form.email) !=0 and User.objects.filter(email=form.email).exists():
                return JsonResponse({'status': 'EMAIL ALREADY EXISTS',}, safe=False)
            if len(form.password) == 0:
                return JsonResponse({'status': 'PASSWORD MISSING',}, safe=False)
            if len(form.password) < 8:
                return JsonResponse({'status': 'PASSWORD LENGTH'}, safe=False)
            if len(password2) == 0:
                return JsonResponse({'status':'PASSWORD2 MISSING'}, safe=False)
            if form.password != password2:
                return JsonResponse({'status':'PASSWORDS DO NOT MATCH'}, safe=False)

            form1 = form.save(commit=False)
            form1.is_supplier = True
            form1.is_active = True
            form1.save()

            # Redirect
            success_url = current_site.domain + '/register/verify/'
            return JsonResponse({'status':'OK', 'success_url': success_url,}, safe=False)

    return render(request, 'vendors/registration/create_account.html')

urls.py

from django.urls import path
from . import views

urlpatterns = [
    # Sell page & Vendor login
    path('', views.sell, name="sell"),

    # Auth
    path('login/', views.vendorLogin, name="vendor_login"),
    path('logout/', views.vendorLogout, name="vendor_logout"),

    # Registration steps
    path('register/', views.createVendorAccount, name="create_vendor_account"),
    path('register/verify/', views.verifyVendor, name="verify_vendor"),
    path('register/verify/resend_otp/', views.resendOTP, name="resend_otp"),
    path('register/success/', views.verifyVendorSuccess, name="verify_vendor_success"),

    # Vendor portal
    path('dashboard/', views.vendorDashboard, name="vendor_dashboard"),
]

hosts.py

from django_hosts import patterns, host
from django.conf import settings
from . import admin_urls

host_patterns = patterns('',
    host(r'www', 'pages.urls', name='www'),
    host(r'sell', 'vendors.urls', name='sell'),
    host(r'admin', admin_urls, name='admin'),
)

Проблема в том, что валидация больше не работает. Когда я нажимаю на Register с пустыми полями, я получаю успешный POST запрос со статусом 200.

Однако валидация не работает, даже если форма заполнена правильно, POST-запрос не сохраняется в БД.

Любая помощь будет очень признательна. Я пытаюсь разобраться в этом уже несколько недель.

Может ли это быть связано с кросс-доменом?

Я не уверен, что мой ответ решит вашу проблему, потому что вы не указали реальную ошибку, но попробуйте, это однажды помогло мне с ajax:

modifed_settings.py:

ALLOWED_HOSTS = ['127.0.0.1', 'www.shop.com', '.shop.com',]

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',

# Third Party
'django_hosts',
'corsheaders',

# Custom
'pages',
'users',
'vendors',
]

MIDDLEWARE = [
'django_hosts.middleware.HostsRequestMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django_hosts.middleware.HostsResponseMiddleware'
]

ROOT_URLCONF = 'sns.urls'
ROOT_HOSTCONF = 'sns.hosts'
DEFAULT_HOST= 'www'
PARENT_HOST = 'surfnshop.mu'
HOST_PORT = '8009'

CSRF_TRUSTED_ORIGINS = ['127.0.0.1', 'www.shop.com', 'shop.com']
CORS_ORIGIN_ALLOW_ALL=True
CORS_ORIGIN_WHITELIST = [
    "http://surfnshop.mu:8009",
    "http://sell.surfnshop.mu:8009",
    'http://localhost:8000',
    'http://127.0.0.1:8000',
    'http://shop.com'
]

Думаю, если он работал до добавления django-hosts, то проблема в settings, а не в самом коде

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