Django-tenants: при перенаправлении на url арендатора после входа в систему возникает ошибка "NoReverseMatch: 'demo.localhost' is not a registered namespace".

Я не могу найти способ решения ошибки, возникающей при аутентификации пользователя.

Пользователь должен войти в систему на уровне публичного сайта, скажем localhost/login, и когда он/она аутентифицируется, мне нужно, чтобы пользователь был перенаправлен в соответствующий поддомен, например demo.localhost. Это не работает для меня до сих пор, даже после проверки некоторых сообщений на эту тему.

Вот views.py в customers.views, где пользователь вошел в систему:

def login_view(request):
    if request.method == 'POST':
        form = AuthenticationForm(request,data=request.POST)
        print("form login view")
        if form.is_valid():
            print("checkpoint")
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            user = authenticate(username=username, password=password)

            user = form.get_user()
            schema_name = user.schema_name

            print(user)
            if user is not None:
                login(request, user)
                url = reverse(schema_name + '.localhost:8000/mydashboard/')
                print("url")
                return HttpResponseRedirect(url)
    else:
        print("not working")
        form = AuthenticationForm()

    context = {
        'form': form,
                }
    return render(request, 'login.html', context)

вот какие урлы находятся в папке core:

urlpatterns = [
    path('admin/', admin.site.urls),
    path('django_plotly_dash/', include('django_plotly_dash.urls')),
    path('mydashboard/', include('mydashboard.urls',namespace="mydashboard")),
    
]

и я добавил app_name = 'mydashboard' в mydashboard.urls

Вот трассировка ошибки, которую я продолжаю получать:

Internal Server Error: /registration/loginUser
Traceback (most recent call last):
  File "/Users/pierre/opt/anaconda3/lib/python3.9/site-packages/django/urls/base.py", line 71, in reverse
    extra, resolver = resolver.namespace_dict[ns]
KeyError: 'demo.localhost'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/pierre/opt/anaconda3/lib/python3.9/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/Users/pierre/opt/anaconda3/lib/python3.9/site-packages/django/core/handlers/base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/pierre/Desktop/simulation_application/customers/views.py", line 65, in login_view
    url = reverse(schema_name + '.localhost:8000/mydashboard/')
  File "/Users/pierre/opt/anaconda3/lib/python3.9/site-packages/django/urls/base.py", line 82, in reverse
    raise NoReverseMatch("%s is not a registered namespace" % key)
django.urls.exceptions.NoReverseMatch: 'demo.localhost' is not a registered namespace

Я не знаю, что еще можно попробовать, есть ли у кого-нибудь подсказка, как решить эту проблему?

reverse - это внутренняя утилита django для перехода от "app name" + ':' + "url friendly name" к "real url". В вашем примере вы уже предоставили "настоящий url".

Заканчивайте, пока вы впереди, и просто сделайте:

            if user is not None:
                login(request, user)
                url = request.scheme + '://' + schema_name + '.localhost:8000/mydashboard/'
                print("url")
                return HttpResponseRedirect(url)
  • Заметить отсутствие reverse
  • Заметьте добавление схемы URL (http/https определяется тем, как был первоначально сделан запрос)
Вернуться на верх