DJango 1.10 登录教程

预备

建议在诸如pyenv等隔离环境中安装Django。以Django 1.10为目标进行说明。

$pip install django

创建项目

我将使用名称为”default_login”创建项目。

$mkdir django_login
$cd django_login
$django-admin.py startproject default_login
$cd default_login
$python manage.py migrate
$python manage.py createsuperuser
 (superuser作成)

$python manage.py runserver

我将尝试使用创建的用户名和密码登录管理界面,网址是 http://127.0.0.1:8000/admin。

创建应用程序

我将创建一个名为”accounts”的应用程序。


$python manage.py startapp accounts
$ls -a
(フォルダが作成されたか確認)

在 settings.py 文件中添加 accounts。
同时,还要添加日语和时区的设置。


INSTALLED_APPS = (
    :
    'accounts',
)

LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'

网址

Django提供了默认的登录和注销视图。
您可以在url.py中使用默认的登录视图进行URL分发。

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url('^', include('django.contrib.auth.urls')),

]

注意:从Django1.10开始,登录视图的URL已经从url(r’^accounts/login/$’,’django.contrib.auth.views.login’)变更为url(‘^’,include(‘django.contrib.auth.urls’))。

通过在urls.py中包含’django.contrib.auth.urls’,可以添加与认证相关的URL和相应的视图。
具体内容请参考django.contrib.auth.urls。
以下是django.contrib.auth.urls的内容。标准提供了用于密码更改的URL和视图,如“password_change”等。
(*由于时间限制,本次仅实现登录和登出功能。)

https://docs.djangoproject.com/en/1.10/topics/auth/default/#module-django.contrib.auth.views
^login/$ [name=’login’]
^logout/$ [name=’logout’]
^password_change/$ [name=’password_change’]
^password_change/done/$ [name=’password_change_done’]
^password_reset/$ [name=’password_reset’]
^password_reset/done/$ [name=’password_reset_done’]
^reset/(?P[0-9A-Za-z_-]+)/(?P[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$ [name=’password_reset_confirm’]
^reset/done/$ [name=’password_reset_complete’]

建立Template

在accounts的文件夹下创建一个名为templates的文件夹。

$cd accounts
$mkdir templates

在templates文件夹中创建一个名为base.html的文件。
在该文件中写下以下内容。

<!DOCTYPE html>
<html>
<head lang="ja">
  <meta charset="UTF-8">
  <title></title>
</head>
<body>
  Welcome Kobe Python MeetUp!
{% block content %}
{% endblock %}
</body>
</html>

为了使用默认的登录视图,我们在templates目录下创建了registration文件夹。
在registration文件夹下创建login.html。
(请注意:必须按照这个目录结构和名称来创建。)

mkdir registration
{% extends "base.html" %}

{% block content %}
ai
{% if form.errors %}
<p>Your username and password didn't match. Please try again.</p>
{% endif %}


<form method="post" action="{% url '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>

{# Assumes you setup the password_reset view in your URLconf #}
<p><a href="{% url 'password_reset' %}">Lost password?</a></p>

{% endblock %}

在此时访问登录URL并登录也不会发生任何事情。(请参考下面)
http://127.0.0.1:8000/login
※登录时请使用超级用户创建时的管理员帐号的用户ID和密码。

如果通过POST方法调用并附带用户提交的凭证,它会尝试登录用户。如果登录成功,视图会重定向到下一个指定的URL。如果没有提供下一个URL,则重定向到设置中的LOGIN_REDIRECT_URL(默认为/accounts/profile/)。如果登录失败,则重新显示登录表单。

当成功登录后,将调用hello视图,并显示hello.html页面。
请在settings.py中记录登录后的URL,并准备以下视图和模板。


# 追記
LOGIN_REDIRECT_URL = '/accounts/hello/'
LOGIN_URL = '/login'

我会在下面追加内容,使以“accounts”开头的URL跳转到“accounts/url”。

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url('^', include('django.contrib.auth.urls')),
    url(r'^accounts/', include('accounts.urls',namespace='accounts')),


]

在`accouts`中处理URL。当请求`accounts/hello`时,调用`hello`视图函数。
在`accounts`文件夹中创建`urls.py`文件,并添加以下内容。

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'hello/$', views.hello, name='hello'),
]

我会创建一个hello.html文件。

{% extends "base.html" %}

{% block content %}
<p><a href="{% url 'logout' %}?next={% url 'login' %}"> Log out</a></p>

<p>Hello! {{ name }}</p>
{% endblock %}

创建视图

我要创建一个hello的视图。


from django.shortcuts import render


# Create your views here.

def hello(request):
    name = request.user
    print(name)
    return render(request, 'hello.html', {'name': name})

当你成功登录后,应该会显示hello.html并显示你的名字。执行 python manage.py runserver。

增加浏览限制

只有已登录的用户才能访问hello视图。只需在hello视图中添加login_required装饰器即可。


from django.shortcuts import render
from django.contrib.auth.decorators import login_required

# Create your views here.

@login_required(login_url='/login/')
def hello(request):
    name = request.user
    print(name)
    return render(request, 'hello.html', {'name': name})

当未登录状态访问http://127.0.0.1:8000/accounts/hello时,会跳转到登录页面。

进一步将认证方式从姓名改为电子邮件。


from django.contrib.auth.hashers import check_password
from django.contrib.auth import get_user_model
from django.contrib.auth.backends import ModelBackend

class UserModelEmailBackend(ModelBackend):

    def authenticate(self, username="", password="", **kwargs):
        try:
            user = get_user_model().objects.get(email__iexact=username)
            if check_password(password, user.password):
                return user
            else:
                return None
        except get_user_model().DoesNotExist:
            # No user was found, return None - triggers default login failed
            return None

在settings.py文件中,设置AUTHENTICATION_BACKENDS如下:
AUTHENTICATION_BACKENDS = [
‘default_login.backends.UserModelEmailBackend’, # 通过电子邮件进行登录
]

我会在下面添加上。
通过这样做,您应该能够先通过电子邮件进行验证。

bannerAds