Я пытаюсь получить локальную копию сайта 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)