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 определяется тем, как был первоначально сделан запрос)