#django #templates #authentication
#django #шаблоны #аутентификация
Вопрос:
Я создаю свое первое приложение django, которое использует аутентификацию пользователя, и я использую несколько примеров, которые я нашел в Интернете для справки. В моих примерах используется метод direct_to_template.
Проблема в том, что при использовании этого я получаю пустой экран. Я знаю, что шаблон находится в моем каталоге шаблонов.
Почему я получаю пустой экран при входе в систему? Как я могу это исправить?
Примеры, которые я использую:
- Пример #1: https://docs.djangoproject.com/en/dev/topics/auth/ Пример #2: http://www.nerdydork.com/django-login-form-on-every-page.html
Мой код приведен ниже:
————-base.html————-
Here is the trigger it's in the header bar.
<li><a href="/login">Log-In</a></li>
——— views.py ————————
from django.template import Context, loader
from django.conf.urls import patterns, url, include
from django.views.generic.simple import direct_to_template
from django.http import HttpResponse
VER = "1a" # Global I like to print; making sure my latest code is running.
def mylogin(request):
print "mylogin called [%s] " % VER
if request.method == 'POST':
user = authenticate(username=request.POST['username'],
password=request.POST['password'])
if user is not None:
if user.is_active:
login(request, user)
# success
return HttpResponseRedirect('/')
else:
# disabled account
return direct_to_template(request, 'inactive_account.html')
else:
# invalid login
return direct_to_template(request, 'invalid_login.html')
# User just clicked login
# *** I know this is getting called and I get a blank screen here ***
print "calling: direct_to_template('login.html')"
return direct_to_template(request, 'login.html')
def mylogout(request):
print "mylogout called"
logout(request)
return direct_to_template(request, 'logged_out.html')
——— urls.py ————————
from django.conf.urls import patterns, include, url
from django.views.generic.simple import direct_to_template
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
(r'^customers/$', 'jim.views.index'),
(r'^customers/(?P<customer_id>d )/$', 'jim.views.detail'),
(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': '/media'}),
(r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': '/static'}),
(r'^login/$', 'jim.views.mylogin'),
(r'^logout/$', 'jim.views.mylogout'),
(r'^site_media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': '/media'}),
url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
url(r'^admin/', include(admin.site.urls)),
)
urlpatterns = patterns('django.views.generic.simple', (r'^accounts/login/$', 'direct_to_template', {'template': 'login_required.html'}),
)
——— templates/login.html ————————
{% if user.is_authenticated %}
<!-- Authenticate account menu -->
{% else %}
<h3>Login</h3>
<form action="/login/" method="post" accept-charset="utf-8">
<label for="username">Username</label><input type="text" name="username" value="" id="username" />
<label for="password">Password</label><input type="password" name="password" value="" id="password" />
<p><input type="submit" value="Login"></p>
</form>
{% endif %}
Комментарии:
1. Я не понимаю, какие шаги вы предпринимаете для воспроизведения «пустого экрана». К какому из ваших URL-адресов вы обращаетесь? Что вы нажимаете? В качестве примечания: у вас есть несколько ошибок с отступами, они могут быть проблемой: в views.mylogin нет отступов после «if request.method == ‘POST’:». И прямо под этим представлением есть строки, которые не являются частью какого-либо представления (?): вызов «print»: direct_to_template(‘login.html ‘)» вернуть direct_to_template(запрос, ‘login.html ‘)»
Ответ №1:
Ошибка, если ваш шаблон такой
{% if user.is_authenticated %}
<!-- Authenticate account menu -->
{% else %}
stuff
{% endif %}
кажется довольно логичным, что ваш шаблон пуст —_—
более того .. 200 не является ошибкой HTTP, это означает, что 200 OK: стандартный ответ для успешных HTTP-запросов.
Комментарии:
1. Да, он прав. Если я помещаю что-то ниже строки 2, оно печатается на странице. Но как можно аутентифицировать пользователя, если аутентификация не была выполнена?
2. это может быть глупо и очевидно, но вы уверены, что не вошли в систему в качестве администратора? -__-
Ответ №2:
Я добавил комментарий к вашему вопросу с просьбой предоставить более подробную информацию. Но без этих деталей я предполагаю, что вам нужно представление для отображения вашего «login.html » шаблон.
Для этого вы можете написать отдельное представление и поместить его в urls.py . Вы можете использовать общий вид direct_to_template в urls.py . Или вы можете изменить свой текущий вид «mylogin», например:
def mylogin(request):
print "mylogin called [%s] " % VER
if request.method == 'POST':
user = authenticate(username=request.POST['username'],
password=request.POST['password'])
if user is not None:
if user.is_active:
login(request, user)
# success
return HttpResponseRedirect('/')
else:
# disabled account
return direct_to_template(request, 'inactive_account.html')
else:
# display login form
return direct_to_template(request, 'login.html')
Разница заключается в отступе и в последней строке (нет данных POST, означает, что это запрос GET для отображения формы входа).
Но, как я уже сказал, есть несколько способов справиться с этим, мое это всего лишь предложение, и я не буду вдаваться ни в какие ваши дизайнерские решения 🙂
Комментарии:
1. Когда я попробовал ваш код, экран по-прежнему пуст. Это заставляет меня думать, что это не имеет ничего общего с аутентификацией, а является проблемой шаблона. Я также получаю ошибку 200. __ «GET /login / HTTP / 1.1» 200 37__