首页 > Web开发 > 详细

Django web编程2 -- 创建用户账户

时间:2019-03-12 13:26:26      阅读:234      评论:0      收藏:0      [点我收藏+]

我们将建立一个用户注册和身份验证系统,让用户能够注册账户,进而登录和注销。我们将创建一个新的应用程序,其中包含与处理用户账户相关的所有功能。我们还将对模型Topic 稍做修改,让每个主题都归属于特定用户。

1、应用程序users

我们首先使用命令startapp 来创建一个名为users 的应用程序:

(ll_env)learning_log$ python manage.py startapp users
(ll_env)learning_log$ ls
db.sqlite3 learning_log learning_logs ll_env manage.py users
(ll_env)learning_log$ ls users
admin.py __init__.py migrations models.py tests.py views.py

这个命令新建一个名为users的目录,其结构与应用程序learning_logs 相同。

1.1 将应用程序users 添加到settings.py中

在settings.py中,我们需要将这个新的应用程序添加到INSTALLED_APPS 中,如下所示:

INSTALLED_APPS = [
    django.contrib.admin,
    django.contrib.auth,
    django.contrib.contenttypes,
    django.contrib.sessions,
    django.contrib.messages,
    django.contrib.staticfiles,

    # 我的应用程序
    learning_logs,
    users,
]

1.2 包含应用程序users 的URL

接下来,我们需要修改项目根目录中的urls.py,使其包含我们将为应用程序users 定义的URL:

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

urlpatterns = [
    url(r^admin/, admin.site.urls),
    url(r‘‘, include(learning_logs.urls,namespace=learning_logs)),
    url(r^users/, include(users.urls, namespace=users)),
]

我们添加了一行代码,以包含应用程序users 中的文件urls.py。这行代码与任何以单词users打头的URL(如http://localhost:8000/users/login/)都匹配。我们还创建了命名空 间‘users‘ ,以便将应用程序learning_logs 的URL同应用程序users 的URL区分开来。

2、登陆页面

我们首先来实现登录页面的功能。为此,我们将使用Django提供的默认登录视图,因此URL模式会稍有不同。在目录learning_log/users/中,新建一个名为urls.py的文件,并在其中添加如下代码:

from django.conf.urls import url
from django.contrib.auth.views import LoginView

from . import views
app_name=users

urlpatterns = [
    # 登录页面
    url(r^login/$, LoginView.as_view(template_name=users/login.html),
       name=login),

]

我们首先导入了默认视图login 。登录页面的URL模式与URL http://localhost:8000/users/login/匹配。这个URL中的单词users让Django在users/urls.py中查找,而单词 login让它将请求发送给Django默认视图login (请注意,视图实参为login ,而不是views.login )。鉴于我们没有编写自己的视图函数,我们传递了一个字典,告诉Django 去哪里查找我们将编写的模板。这个模板包含在应用程序users 而不是learning_logs 中。

(1)模板login.html

用户请求登录页面时,Django将使用其默认视图login ,但我们依然需要为这个页面提供模板。为此,在目录learning_log/users/中,创建一个名为templates的目录,并在其中创建一个名为users的目录。以下是模板login.html,你应将其存储到目录learning_log/users/templates/users/中:

{% extends "learning_logs/base.html" %}

{% block content %}

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

  <form method="post" action="{% url ‘users:login‘ %}">
  {% csrf_token %}
  {{ form.as_p }}

  <button name="submit">log in</button>
  <input type="hidden" name="next" value="{% url ‘learning_logs:index‘ %}" />
  </form>

{% endblock content %}
  • 这个模板继承了base.html,旨在确保登录页面的外观与网站的其他页面相同。请注意,一个应用程序中的模板可继承另一个应用程序中的模板。
  • 如果表单的errors 属性被设置,我们就显示一条错误消息,指出输入的用户名—密码对与数据库中存储的任何用户名—密码对都不匹配。

我们要让登录视图处理表单,因此将实参action 设置为登录页面的URL。登录视图将一个表单发送给模板,在模板中,我们显示这个表单并添加一个提交按 钮。我们包含了一个隐藏的表单元素——‘next‘ ,其中的实参value 告诉Django在用户成功登录后将其重定向到什么地方——在这里是主页。

(2)链接到登陆页面

下面在learning_logs/templates/learning_logs/base.html中添加到登录页面的链接,让所有页面都包含它。用户已登录时,我们不想显示这个链接,因此将它嵌套在一个{% if %}标签中:

<p>
    <a href="{% url ‘learning_logs:index‘ %}">Learning Log</a>
    <a href="{% url ‘learning_logs:topics‘ %}">Topics</a>
    {% if user.is_authenticated %}
      Hello, {{ user.username }}.
    {% else %}
        <a href="{% url ‘users:login‘ %}">log in</a>
    {% endif %}
</p>

{% block content %}{% endblock content %}

在Django身份验证系统中,每个模板都可使用变量user ,这个变量有一个is_authenticated 属性:如果用户已登录,该属性将为True ,否则为False 。这让你能够向已 通过身份验证的用户显示一条消息,而向未通过身份验证的用户显示另一条消息。
在这里,我们向已登录的用户显示一条问候语。对于已通过身份验证的用户,还设置了属性username ,我们使用这个属性来个性化问候语,让用户知道他已登录。对于还未通过身份验证的用户,我们再显示一个到登录页面的链接。
(3)使用登陆页面

前面建立了一个用户账户,下面来登录一下,看看登录页面是否管用。请访问http://localhost:8000/admin/,如果你依然是以管理员的身份登录的,请在页眉上找到注销链接并单击
它。
注销后,访问http://localhost:8000/users/login/,你将看到类似于图19-4所示的登录页面。输入你在前面设置的用户名和密码,将进入页面index。。在这个主页的页眉中,显示了一条 个性化问候语,其中包含你的用户名。

技术分享图片

 3、注销

 现在需要提供一个让用户注销的途径。我们不创建用于注销的页面,而让用户只需单击一个链接就能注销并返回到主页。为此,我们将为注销链接定义一个URL模式,编写一个 视图函数,并在base.html中添加一个注销链接。

(1)注销url

下面的代码为注销定义了URL模式,该模式与URL http://locallwst:8000/users/logout/匹配。修改后的users/urls.py如下:

from django.conf.urls import url
from django.contrib.auth.views import LoginView

from . import views
app_name=users

urlpatterns = [
    # 登录页面
    url(r^login/$, LoginView.as_view(template_name=users/login.html),
       name=login),

    # 注销
    url(r^logout/$, views.logout_view, name=logout),
]

这个URL模式将请求发送给函数logout_view() 。这样给这个函数命名,旨在将其与我们将在其中调用的函数logout() 区分开来。

2. 视图函数logout_view()

函数logout_view() 很简单:只是导入Django函数logout() ,并调用它,再重定向到主页。请打开users/views.py,并输入下面的代码:

from django.shortcuts import render
from django.http import HttpResponseRedirect
from django.urls import reverse
from django.contrib.auth import logout

def logout_view(request):
    """注销用户"""
    logout(request)
    return HttpResponseRedirect(reverse(learning_logs:index))

我们从django.contrib.auth中导入了函数logout()。我们调用了函数logout() ,它要求将request 对象作为实参。然后,我们重定向到主页。

(3)链接到注销页面

现在我们需要添加一个注销链接。我们在learning_logs/templates/learning_logs/base.html 中添加这种链接,让每个页面都包含它;我们将它放在标签{% if user.is_authenticated %}中,使得仅当用户登录后 才能看到它:

<p>
    <a href="{% url ‘learning_logs:index‘ %}">Learning Log</a>
    <a href="{% url ‘learning_logs:topics‘ %}">Topics</a>
    {% if user.is_authenticated %}
      Hello, {{ user.username }}.
      <a href="{% url ‘users:logout‘ %}">log out</a>
    {% else %}
        <a href="{% url ‘users:login‘ %}">log in</a>
    {% endif %}
</p>

{% block content %}{% endblock content %}

下图显示了用户登录后看到的主页。这里的重点是创建能够正确工作的网站,因此几乎没有设置任何样式。确定所需的功能都能正确运行后,我们将设置这个网站的样式,使 其看起来更专业。

技术分享图片

4、注册页面

下面来创建一个让新用户能够注册的页面。我们将使用Django提供的表单UserCreationForm ,但编写自己的视图函数和模板。

(1)注册页面的URL模式

下面的代码定义了注册页面的URL模式,它也包含在users/urls.py中:

from django.conf.urls import url
from django.contrib.auth.views import LoginView

from . import views
app_name=users

urlpatterns = [
    # 登录页面
    url(r^login/$, LoginView.as_view(template_name=users/login.html),
       name=login),

    # 注销
    url(r^logout/$, views.logout_view, name=logout),

    # 注册页面
    url(r^register/$, views.register, name=register),
]

(2). 视图函数register()

在注册页面首次被请求时,视图函数register() 需要显示一个空的注册表单,并在用户提交填写好的注册表单时对其进行处理。如果注册成功,这个函数还需让用户自动登 录。请在users/views.py中添加如下代码:

 

 

 

 

 

 

 

 

参考资料:

1、python编程,从入门到实践

Django web编程2 -- 创建用户账户

原文:https://www.cnblogs.com/anovana/p/10515480.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!