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’, # 通过电子邮件进行登录
]
我会在下面添加上。
通过这样做,您应该能够先通过电子邮件进行验证。