【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 上显示。

スクリーンショット 2018-11-18 22.49.35.png

让我们进行用户创建,以便能够登录。

% 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错误。

スクリーンショット 2018-11-18 22.54.20.png

接下来,我们来创建索引页吧。

创建索引页面

作为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'

我已经完成了创建登录转移页面的工作。

login.gif

结束语

我会加快速度一点点。

系列 (xì liè)

第一部分 ← 第二部分 → 第三部分

文献引用

    • はじめての Django アプリ作成、その 1

 

    • https://docs.djangoproject.com/ja/2.0/topics/auth/default/

 

    Django Login/Logout Tutorial (Part 1)
bannerAds