python - logoutview - login django example
página de inicio de sesión formulario Django (5)
Encontré la solución.
Primero, personalice las vistas de inicio y cierre de sesión:
vistas.py
def login_user(request):
logout(request)
username = password = ''''
form1 = RegistrationForm()
if request.POST:
username = request.POST[''username'']
password = request.POST[''password'']
user = authenticate(username=username, password=password)
if user is not None:
login(request, user)
return redirect("redirect any whre u want")
return render(request, ''Write login templaye address'')
def logout_user(request):
user = request.user
logout(request, user)
return redirect("redirect any whre u want")
Entonces en tu base.html deberías hacer esto:
base.html
<form method="post" action="/user/login/" novalidate>
{% csrf_token %}
<input class="form-control" id="id_username" name="username" placeholder=""
required="" type="text"
style="">
</div>
<div class="form-group">
<span class="material-icons" style=""
>lock</span>
<input class="form-control" id="password1" name="password" style="" autofocus=""
placeholder=""
required=""
type="password">
</div>
<button class="btn btn-primary" type="submit" style=""></button>
</div>
</form>
Y login.html
<form method="post" action="/user/login/">
{% csrf_token %}
<div class="form-group">
<p>
<label for="id_username">username</label>
<input class="form-control" id="id_username" name="username" autofocus="" required="" type="text">
</p>
<p>
<label for="id_password">password</label>
<input class="form-control" id="id_password" name="password" autofocus="" required="" type="password">
</p>
<button type="submit">login</button>
</div>
</form>
urls.py
url(r''^login/$'', views.login_user, name=''login''),
url(r''^logout/$'', views.logout_user),
En realidad, toma entradas en la página de inicio y les da acceso a la página de inicio de sesión, lo que es bueno para el manejo de errores de entrada.
Quiero crear una página de inicio con un encabezado que solicite iniciar sesión con nombre de usuario / contraseña y un botón de inicio de sesión para iniciar sesión. Actualmente, la configuración de mi página es que al presionar inicio de sesión me enviará a una página de inicio de sesión. Quiero simplemente ingresar la información y presionar "iniciar sesión" para iniciar sesión en la página de inicio de mi sitio. ¿Cómo puedo diseñar mi urls.py
y views.py
para iniciar sesión en la página de inicio?
Tengo un base.html
que es la plantilla de mi página principal. Dentro de la plantilla, hice un login.html
vista parcial:
<form action=''/accounts/auth/'' method=''POST''> {% csrf_token %}
<div >
<label for=''username''> Username </label>
<input type=''text'' name=''Username'' id=''username''>
<label for=''password''>Password </label>
<input type=''password'' name=''Password'' id=''password''>
<input type=''submit'' value=''login''>
</div>
</form>
Estoy un poco confundido con el atributo de action
ya que no estoy seguro de dónde enviar los datos del formulario si quisiera autorizar el inicio de sesión en la misma página.
Mis vistas.py
def login(request):
c = {}
c.update(csrf(request))
return render(request, ''login.html'', c)
def auth_view(request):
username = request.POST.get(''username'', '''')
password = request.POST.get(''password'', '''')
user = auth.authenticate(username = username, password = password)
if user is not None:
auth.login(request, user)
return HttpResponseRedirect(''/accounts/loggedin'')
else:
return HttpResponseRedirect(''/accounts/invalid'')
No estoy seguro de dónde hacer HttpResponseRedirect
también si el inicio de sesión se realiza en la página de inicio.
Quizás pueda hacer un render(request,SomePartialView.html)
lugar de HttpResponseRedirect
.
Aquí está mi urls.py:
url(r''^$'', ''photoblog.views.login''), #displays login.html
url(r''^accounts/auth/$'', ''photoblog.views.auth_view''), #authorize login
Puede utilizar el registro incorporado de Django en el formulario. Es fácil y eficiente. Y le brindará algunas funciones como la verificación de validación de formularios.
en urls.py:
url(r''^login/$'',views.loginView,name=''login''),
en views.py:
from django.contrib.auth.views import login
from django.contrib.auth.forms import AuthenticationForm
def loginView(request):
if request.method == ''POST'':
form = AuthenticationForm(data=request.POST)
if form.is_valid():
user = form.get_user()
login(request, user)
return redirect(''/website/profile/'')
else:
form = AuthenticationForm()
return render(request, ''website/login.html'', {''form'': form})
en la página html:
<form method="post">
{% csrf_token %}
{{form.as_p}}
<p><input type="submit" value="Log in"></input></p>
Recomiendo django-registration
es bastante fácil. Hay una verificación de correo electrónico también en él.
Necesitas un url
adicional que digas en casa:
url(r''^home/$'', ''photoblog.views.home'',name=''home''),
.............
En sus views
, home
acceso al home
se limitaba solo a los usuarios registrados.
from django.contrib.auth.decorators import login_required
@login_required(login_url=''/'') #if not logged in redirect to /
def home(request):
return render(request, ''home.html'')
no necesitas csrf
en login.py
es decir:
def login(request):
return render(request, ''login.html'')
Es suficiente, ya que el render
pasa el token csrf.
from django.core.urlresolvers import reverse
def auth_view(request):
username = request.POST.get(''username'', '''')
password = request.POST.get(''password'', '''')
user = auth.authenticate(username = username, password = password)
if user is not None:
auth.login(request, user)
return HttpResponseRedirect(reverse(''home''))
else:
return HttpResponseRedirect(''/accounts/invalid'')
Si solo desea tener una página de inicio con contenido estático que maneje los inicios de sesión, la aplicación de autenticación incorporada de Django puede manejar esto con muy poco esfuerzo. Solo debe vincular una URL a django.contrib.auth.views.login
y probablemente una a django.contrib.auth.views.logout
, escribir una plantilla de inicio de sesión y una plantilla de cierre de sesión, luego establecer un par de variables de configuración.
La configuración completa se documenta aquí: https://docs.djangoproject.com/en/dev/topics/auth/default/#module-django.contrib.auth.views
Aquí están los bits relevantes de un proyecto de trabajo mío:
urls.py:
# HomeView is a simple TemplateView that displays post-login options
urlpatterns = patterns('''',
...
url(r''^myapp/$'', HomeView.as_view(template_name=''home.html''), name=''home''),
url(r''^accounts/login/$'', ''django.contrib.auth.views.login'', name=''login''),
url(r''^accounts/logout/$'', ''django.contrib.auth.views.logout'', name=''logout''),
...
)
settings.py:
from django.core.urlresolvers import reverse_lazy
...
LOGIN_URL = reverse_lazy(''login'')
LOGIN_REDIRECT_URL = reverse_lazy(''home'')
templates/registration:
login.html:
{% extends "base.html" %}
{% block head %}
<title>Login</title>
{% endblock %}
{% block body %}
{% if form.errors %}
<p>Your username and password didn''t match. Please try again.</p>
{% endif %}
<form method="post" action="{% url ''django.contrib.auth.views.login'' %}">
{% csrf_token %}
<table>
<tr>
<td>{{ form.username.label_tag }}</td>
<td>{{ form.username }}</td>
</tr>
<tr>
<td>{{ form.password.label_tag }}</td>
<td>{{ form.password }}</td>
</tr>
</table>
<input type="submit" value="login" />
<input type="hidden" name="next" value="{{ next }}" />
</form>
{% endblock %}
logged_out.html:
{% extends "base.html" %}
{% block head %}
<title>Logged out</title>
{% endblock %}
{% block body %}
<p>You have been logged out. You may <a href="{% url ''login'' %}">log back in</a>.</p>
{% endblock %}
No estoy mostrando mi plantilla base.html
pero confío en que el patrón sea obvio. Si desea más que un login.html
formulario de inicio de sesión, no hay razón para que su plantilla login.html
no pueda ser más sofisticada. Los nombres son valores predeterminados, como se documenta para las vistas, pero puede usar otras opciones si lo desea.
Eso es todo lo que necesitas para el comportamiento básico. Si login_required
sus vistas con el decorador login_required
para iniciar sesión como se describe en los docs , se redirigirá a su página de inicio de sesión cada vez que un usuario no autenticado intente acceder a una de sus vistas. O, si está usando vistas basadas en clases, use @method_decorator(login_required)
como se documenta here . Dos fragmentos más de mi proyecto:
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
class HomeView(TemplateView):
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(HomeView, self).dispatch(*args, **kwargs)
@login_required
def report_for_group(request, group_id):
...
Los documentos incluyen discusiones sobre configuraciones más complicadas, en caso de que las necesite.
Utilizando Django 1.11. Tuve el mismo problema ahora, aquí está lo que funcionó para mí ...
Importe la clase de vista de inicio de sesión desde la aplicación de autenticación incorporada y pase su archivo de plantilla a través del nombre de template_name
kwarg.
En urls.py:
from django.contrib.auth.views import LoginView
app_name = ''yourapp''
urlpatterns = [
url(r''^$'', LoginView.as_view(template_name=''yourapp/index.html''), name="index"),
]
Y en su opinión, puede utilizar la variable de formulario para representar su formulario. En mi caso utilizo bootstrap así.
En index.html:
{% extends ''base.html'' %}
{% loads bootstrap %}
{% block content %}
<form method="post" action="{% url ''login'' %}">
{% csrf_token %}
{% bootstrap_form form %}
{% bootstrap_button "Login" button_type="submit" button_class="btn-primary" %}
{# Assumes you setup the password_reset view in your URLconf #}
<p><a href="{% url ''password_reset'' %}">Lost password?</a></p>
</form>
{% endblock content %}