Домашняя страница входа в систему Django

Я хочу создать домашнюю страницу с заголовком, который запрашивает логин с именем пользователя/паролем и кнопкой входа в систему для входа в систему. В настоящее время, как я настроил свою страницу, нажатие логина отправит меня на страницу входа. Я хочу просто ввести информацию и нажать "Войти" для входа на домашнюю страницу моего сайта. Как я могу создать свои urls.py и views.py для входа на главную страницу?

У меня есть base.html, который является шаблоном для моей главной страницы. Внутри шаблона я сделал частичный вид login.html:

<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>

Я немного смущен для атрибута action, так как я не уверен, куда отправлять эти данные формы, если я хотел авторизовать логин на той же странице.

My views.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')

Я не уверен, где HttpResponseRedirect, а если вход в систему выполняется на главной странице.

Возможно, я могу сделать render(request,SomePartialView.html) вместо HttpResponseRedirect.

Вот мой urls.py:

url(r'^$', 'photoblog.views.login'),   #displays login.html
url(r'^accounts/auth/$', 'photoblog.views.auth_view'),    #authorize login

Ответы

Ответ 1

Если вы просто хотите иметь домашнюю страницу со статическим контентом, который обрабатывает логины, встроенное приложение auth для Django может справиться с этим с минимальными усилиями. Вам просто нужно привязать URL-адрес к django.contrib.auth.views.login и, возможно, к django.contrib.auth.views.logout, написать шаблон входа и шаблон после выхода, а затем установить пару переменных настройки.

Полная настройка документирована здесь: https://docs.djangoproject.com/en/dev/topics/auth/default/#module-django.contrib.auth.views

Вот соответствующие биты моего рабочего проекта:

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 %}

Я не показываю свой шаблон base.html, но я уверен, что шаблон очевиден. Если вы хотите больше, чем просто форма входа в систему, нет причин, по которым ваш шаблон login.html не может быть более привлекательным. Имена являются значениями по умолчанию, как описано для просмотров, но вы можете использовать другие варианты, если хотите.

Это все, что вам нужно для основного поведения. Если вы завернете свои представления с помощью декоратора login_required, как описано в docs, он будет перенаправляться на вашу страницу входа в систему, аутентифицированный пользователь пытается получить доступ к одному из ваших просмотров. Или, если вы используете представления на основе классов, используйте @method_decorator(login_required), как описано здесь. Еще два фрагмента из моего проекта:

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):
     ...

Документы включают обсуждения более сложных настроек, если они вам понадобятся.

Ответ 2

Я рекомендую django-registration, это довольно просто. в нем есть подтверждение по электронной почте.

вам нужно добавить url home:

url(r'^home/$', 'photoblog.views.home',name='home'),
.............

доступ к нему views, home ограничивался только зарегистрированными пользователями

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')

вам не нужно csrf в login.py

т

def login(request):
    return render(request, 'login.html')

достаточно, поскольку render будет передавать токен 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')

Ответ 3

Использование Django 1.11. У меня была такая же проблема только сейчас, вот что сработало для меня...

Импортируйте класс просмотра входа из встроенного приложения auth и передайте его в файл шаблона с помощью template_name kwarg.

В 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"),
]

И в вашем представлении вы можете использовать переменную формы для визуализации своей формы. В моем случае я использую bootstrap так.

В 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 %}

Ответ 4

Вы можете использовать Django, встроенную в log-форму. Это легко и эффективно. И это даст вам некоторые функции, такие как проверка проверки формы.

в urls.py:

url(r'^login/$',views.loginView,name='login'),  

в 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})

на странице html:

<form method="post">
{% csrf_token %}
{{form.as_p}}
<p><input type="submit" value="Log in"></input></p>

Ответ 5

Я нашел решение.

сначала настройте виды входа и выхода из системы:

views.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")

Затем в вашем base.html вы должны сделать следующее:

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>

И 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),

Фактически вы берете входные данные на домашней странице и предоставляете им страницу входа в систему, которая хороша для обработки ошибок ввода.