【Django】使用Django进行Web开发项目Part2 – 制作登录页面 –
首先
我們已經有一段時間沒有繼續前次的內容了,但我們希望能夠繼續進行使用Django進行Web開發的工作。
這次我們想要繼續進行使用Django創建登錄驗證畫面的工作。
创建应用程序
通过在Django的TOP目录中创建应用程序来创建独立操作的应用程序。项目是将这些应用程序组合在一起的集合。您也可以将应用程序命名为sample_project/作为子模块,但这次我们决定将其放置在TOP目录中。
要创建一个应用程序,请进入manage.py所在的目录,并执行以下命令。
% python manage.py startapp polls
投票的目录结构如下所示。
% ls -al polls
total 21
drwxr-xr-x 3 himrock922 himrock922 9 11月 4 18:18 .
drwxr-xr-x 6 himrock922 himrock922 12 11月 4 18:18 ..
-rw-r--r-- 1 himrock922 himrock922 0 11月 4 18:18 __init__.py
-rw-r--r-- 1 himrock922 himrock922 63 11月 4 18:18 admin.py
-rw-r--r-- 1 himrock922 himrock922 91 11月 4 18:18 apps.py
drwxr-xr-x 2 himrock922 himrock922 3 11月 4 18:18 migrations
-rw-r--r-- 1 himrock922 himrock922 57 11月 4 18:18 models.py
-rw-r--r-- 1 himrock922 himrock922 60 11月 4 18:18 tests.py
-rw-r--r-- 1 himrock922 himrock922 63 11月 4 18:18 views.py
创建视图
我将开始编写Django中最简单的视图页面。
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the polls index.")
为了调用一个能够进行简单字符输出的视图,需要将其与URL相对应。
因此,需要使用URLconf。
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
调用views.py中的index方法,将路径命名为index并进行关联。
然后,在根URLConf中加载accounts.urls模块。
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('polls/', include('polls.urls')),
path('admin/', admin.site.urls),
]
include()函数可以引用到其他URLConf。
我已经成功创建了一个简单的URL路径。我原本想要创建一个与此内容相关的登录认证页面,但实际上Django已经提供了认证系统。
使用Django的认证系统创建登录认证系统。
使用Django的身份验证系统
这里有详细的规格说明,但因为信息量太多,所以阅读起来有些困难汗。暂时来说,已经有了django.contrib.auth,其中包含了实现认证所需的方法和模型,所以不需要使用startapp来创建。这仅仅是一部分,为了更好理解,还可以参考另一份文献:Django登录/登出教程(第一部分)。
在此之前,已经实现了用于认证的视图,但由于在模板层面上没有提供相应的支持,因此需要每个人自行实现。此外,由于没有提供注册的方法,因此也需要每个人自行撰写。无论如何,不需要使用startapp来创建应用程序,所以我们将以上面的Django登录/注销教程(第一部分)作为参考来创建登录认证。
% rm -rf polls
二次认证应用
在构建Django项目时,会自动安装auth应用程序。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
为了使用Auth应用程序,我们需要将urls.py文件中的accounts子路径与auth.urls的模式关联起来。
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('admin/', admin.site.urls),
path('accounts/', include('django.contrib.auth.urls')),
]
如果包括auth应用程序,则提供以下认证视图。
accounts/login/ [name='login']
accounts/logout/ [name='logout']
accounts/password_change/ [name='password_change']
accounts/password_change/done/ [name='password_change_done']
accounts/password_reset/ [name='password_reset']
accounts/password_reset/done/ [name='password_reset_done']
accounts/reset/<uidb64>/<token>/ [name='password_reset_confirm']
accounts/reset/done/ [name='password_reset_complete']
顺便说一下,这次将设置时间和日本语言设置,并将数据库从sqlite3更改为postgresql。
% sudo pkg install postgresql10-server-10.5 postgresql10-contrib-10.5
% sudo vim /etc/login.conf
postgres:\
:lang=en_US.UTF-8:\
:setenv=LC_COLLATE=C:\
:tc=default:
% sudo vim /etc/rc.conf
postgresql_class="postgres"
postgresql_enable="YES"
% sudo service postgresql initdb
% sudo service postgresql start
$ sudo su - postgres
$ createdb mydb
$ createuser -P
$ psql
$ GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;
% pip install psycopg2
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'mydb',
'USER': 'myuser',
'PASSWORD': 'mypass',
'HOST': 'localhost',
'PORT': '',
}
}
(中略)
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'
创建登录页面
我会创建一个登录页面。使用auth默认会加载registration文件夹下的模板文件夹。我会创建一个名为registration的文件夹,并将login.html作为登录模板创建在其中。
% mkdir -p templates/registration
<h2>Login</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Login</button>
</form>
在中国拥有本地化环境下,可以使用 {% csrf_token %} 来生成 CSRF Token ,同时可以使用 {{ form.as_p }} 来创建登录表单。
接下来,为了让Django能够找到templates目录,我们需要修改settings.py文件。
另外,要指定成功登录后的重定向页面,请添加LOGIN_REDIRECT_URL。
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
LOGIN_REDIRECT_URL = '/'
在创建用户之后,重新启动Django,登录页面将在 http://127.0.0.1:8080/accounts/login 上显示。

让我们进行用户创建,以便能够登录。
% python3.7 manage.py migrate (git)-[feature/add_login]
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying sessions.0001_initial... OK
% python manage.py createsuperuser
ユーザー名 (leave blank to use '*********'):
メールアドレス: ********
Password:
Password (again):
Superuser created successfully.
由于尚未创建登录成功后的重定向页面,因此您可以使用上述用户登录,但响应将返回404错误。

接下来,我们来创建索引页吧。
创建索引页面
作为index页面和所有页面共享的render页面,创建application.html作为索引页。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>{% block title %}Django Auth Tutorial{% endblock %}</title>
</head>
<body>
<main>
{% block content %}
{% endblock %}
</main>
</body>
</html>
{% extends 'application.html' %}
{% block title %}Home{% endblock %}
{% block content %}
{% if user.is_authenticated %}
Hi {{ user.username }}!
{% else %}
<p>You are not logged in</p>
<a href="{% url 'login' %}">login</a>
{% endif %}
{% endblock %}
另外,随之而来,我们将调整以使login.html加载application.html。
{% extends 'application.html' %}
{% block title %}Login{% endblock %}
{% block content %}
<h2>Login</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Login</button>
</form>
{% endblock %}
接下来,我们会修改urls.py文件,并在/的URL模式中指定要加载的模板。
from django.contrib import admin
from django.urls import include, path
from django.views.generic.base import TemplateView
urlpatterns = [
path('admin/', admin.site.urls),
path('accounts/', include('django.contrib.auth.urls')),
path('', TemplateView.as_view(template_name='index.html'), name='index'),
]
最后将LOGIN_REDIRECT_URL从/更改为index。
LOGIN_REDIRECT_URL = 'index'
我已经完成了创建登录转移页面的工作。

结束语
我会加快速度一点点。
系列 (xì liè)
第一部分 ← 第二部分 → 第三部分
文献引用
-
- はじめての Django アプリ作成、その 1
-
- https://docs.djangoproject.com/ja/2.0/topics/auth/default/
- Django Login/Logout Tutorial (Part 1)