HttpResponseRedirect после формы входа не перенаправляется в профиль

Я пытаюсь получить локальную копию сайта Django. Производственный сайт работает очень хорошо при входе в систему, но мой локальный экземпляр не перенаправляется на страницу профиля после заполнения формы входа.

Это представление login_page:

def login_page(request):
  profile_page = HttpResponseRedirect('profile')
  if request.user.is_authenticated():
    return profile_page
  form = LoginForm(request.POST or None)
  if request.POST and form.is_valid():
    user = form.login(request)

    if user:
      login(request, user)
      return profile_page

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

Это результат вывода отладки сервера:

Performing system checks...

<function home_page at 0x7f77ad696c08>
System check identified no issues (0 silenced).
July 08, 2017 - 03:21:39
Django version 1.9.1, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
[08/Jul/2017 03:21:49] "GET / HTTP/1.1" 200 3276
[08/Jul/2017 03:21:50] "GET /login HTTP/1.1" 200 2370
[08/Jul/2017 03:21:57] "POST /login HTTP/1.1" 302 0
[08/Jul/2017 03:21:57] "GET /profile HTTP/1.1" 302 0
[08/Jul/2017 03:21:57] "GET /login?next=/profile HTTP/1.1" 200 2370

После этого браузер остается в http://127.0.0.1:8000/login?next=/profile и просто отображает стандартную страницу входа.

Опять же, идентичный код работает с той же версией Django в производстве (хотя он работает через gunicorn/nginx вместо django-admin runserver), поэтому мне кажется, что в моей конфигурации Django мне что-то не хватает, фактическая проблема с кодом.

urls.py записи:

from accounts import urls as account_urls
...
  url(r'^', include(account_urls)),

счета/urls.py:

from django.conf.urls import url

import accounts.views

urlpatterns = [
  url(r'profile/?$', accounts.views.user_profile_page,
      name='user_profile_page'),

Профиль (это никогда не запускается AFICT - придерживание точки останова там не помогает):

@login_required
def user_profile_page(request):
    """Returns user home page, with respective user status of surveys."""

    print "User profile accessed: %s" % request

    // user specific data here

    context = {'some': some, 'data': data,
               'here': here, }
    return render(request, 'accounts/profile.html', context)

Также интересно: resolve_url, похоже, не выполняет переназначение, как я ожидал:

(Pdb) resolve_url('/profile')
'/profile'

Не следует ли указывать на acccounts/profile или 127.0.0.1:8000/profile или что-то в этом роде?

Это метод аутентификации AUTHENTICATION_BACKEND ', который выполняется (не уверен, как это отличается от стандартного Django). Все ответы здесь подразумевают, что authenticate должен принять аргумент request - могу ли я обновить этот метод, чтобы добавить что-то здесь?:

def authenticate(self, username=None, password=None, **kwargs):
    UserModel = get_user_model()
    if username is None:
        username = kwargs.get(UserModel.USERNAME_FIELD)
    try:
      if username is not None:
        username = username.lower()

      user = UserModel._default_manager.get_by_natural_key(username)
      if user.check_password(password):
        return user
    except UserModel.DoesNotExist:
        # Run the default password hasher once to reduce the timing
        # difference between an existing and a non-existing user (#20760).
        UserModel().set_password(password)

Ответ 1

Changed in Django 1.10:
In older versions, when you’re manually logging a user in, you must successfully authenticate the user with authenticate() before you call login(). Now you can set the backend using the new backend argument.

Если вы используете Django <= 1.10, вы должны использовать метод аутентификации перед входом в систему. В противном случае, вы должны пропустить сервер аутентификации по крайней мере в методе входа. Вот фрагмент кода из django docs.

username = request.POST['username']
password = request.POST['password']
user = authenticate(request, username=username, password=password)
if user is not None:
    login(request, user)
    # Redirect to a success page.
    ...
else:
    # Return an 'invalid login' error message.
    ...

Ответ 2

попробуйте это

from django.shorcuts import redirect
from django.contrib.auth import authenticate
def login_page(request):
  profile_page = HttpResponseRedirect('profile')
  if request.user.is_authenticated():
    return profile_page
  form = LoginForm(request.POST or None)
  if request.POST and form.is_valid():
    user = authenticate(request,username=form.cleaned_data['username'],password=form.cleaned_data['password'])

    if user:
      login(request, user)
      return redirect('profile')

Ответ 3

Попробуйте изменить:

  profile_page = HttpResponseRedirect('profile')

в

  profile_page = HttpResponseRedirect(reverse('profile'))

Ответ 4

попробуйте с представлением класса с басами

class Login(FormView, View):

    template_name = 'login/login.html'
    form_class = AuthenticationForm
    success_url = reverse_lazy("your_succes:url")

    def dispatch(self, request, *args, **kwargs):

        if request.user.is_authenticated():
            return HttpResponseRedirect(self.get_success_url())
        else:
            return super(Login, self).dispatch(request, *args, **kwargs)

    def form_valid(self, form):
        login(self.request, form.get_user())
        return super(Login, self).form_valid(form)

Ответ 5

чтобы ваша страница перенаправлялась на какой-либо другой URL-адрес, который вам требуется использовать для импорта перенаправлять из ярлыков Django и использовать это для перенаправления на требуемый URL-адрес, это доступные (так как вы уже создали сайт Django) в urls.py, вы можете посмотреть ссылку на видео youtube

https://www.youtube.com/watch?v=aCotgGyS2gc&list=PL6gx4Cwl9DGBlmzzFcLgDhKTTfNLfX1IK&index=35

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

Отвечая на Вопрос о gunicorn/nginx, сервер приложений имеет свой набор маршрутов по умолчанию, возможно, вы сделали это в сборке сборки, на страницу профиля, когда добавлена ​​информация о сеансе.

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

вы также можете попробовать с обратным URL-адресом

Ответ 6

Вместо HttpResponseRedirect, который запускает HTTP 302, используйте HttpResponseTemporaryRedirect для запуска HTTP 307.

Случается, что 302 не гарантирует повторение запроса POST. Причина такова:

RFC 1945 и RFC 2068 указывают, что клиенту не разрешено изменять метод по перенаправленному запросу. Однако большинство существующих пользователей реализация агента обрабатывает 302, как если бы это был ответ 303, выполнение GET в поле значения местоположения независимо от оригинальный запрос способ. Добавлены коды статуса 303 и 307 для серверов, которые хотят однозначно понять, какие ожидается реакция клиента.

В чем разница между перенаправлением 302 и 307?