用户账户
创建用户账户
建立一个用户注册和身份验证系统,让用户能够注册账户,进而登录和注销。创建一个新的应用程序,其中包含与处理用户账户信息相关的所有功能。对topic模型做出修改,让每个Topic和post都归属于特定的用户。
应用程序users
使用startapp
创建应用程序users:
将users应用添加到 settings.py 中。
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 创建的应用
'learning_logs',
'users',
]
Django命名空间和URL模式的包含
Django允许多个URL指向一个视图,这样URL的逆向解析(reverse
)就会出现困难,因为同一个视图有两个结果可以匹配。所以就用到了url()函数的参数name
,独一无二的name
参数使得逆向解析就变得一一对应了。
{% url 'topic' topic.id %}
更好的解决方式就是使用命名空间namespace
。即使不同的应用程序使用相同的URL名称,URL命名空间也能唯一地逆向解析URL模式。同一个应用生成的多个实例的URL模式可以被区分开来。
URL的namespace由2部分组成:
- 应用级别的namespace:用来描述正在部署的应用(application),同一个应用程序的每个实例都具有相同的应用程序命名空间。多个应用间,可能产生同名的url,在各自应用下的
urls.py
中使用app_name
的变量就可以区分它们是否来自不同的应用。 - 实例级别的namespace:一个app,可以创建多个实例(instance)。多个实例间URL使用应用命名空间进行逆向解析就会出现问题。使用实例命名空间的方法是在包含(
include
)其他URL模式时,使用关键参数namespace=
。实例级别的命名空间名可以和应用级别的命名空间名相同,这种方法用来指定应用的默认实例。
Django允许在一个URL模式中包含其他URL模式,使用django.urls下include
可以从其他应用下的 urls.py 中导入URL模式。使用方法:include(module, namespace=None)
命名空间用:
符号来链接URL,如learning_logs:topics
,users:index
。
将命名空间引入项目中,在learning_logs和users应用下创建各自应用的urls.py
。并修改learning_logs下视图函数和模板的逆向解析URL。
learning_logs/urls.py:
from django.urls import path
from . import views
app_name = 'learning_logs'
urlpatterns = [
path('', views.index, name='index'),
path('topic/<int:topic_id>/', views.topic, name='topic'),
path('topics/', views.topics, name='topics'),
path('new_topic/', views.new_topic, name='new_topic'),
path('new_post/<int:topic_id>/', views.new_post, name='new_post'),
path('edit_post/<int:post_id>/', views.edit_post, name='edit_post'),
]
在项目目录下的urls.py中:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('learning_logs.urls', namespace='learning_logs')),
]
Django身份验证系统
Django的身份验证系统(authentication system)提供了用户身份验证(authenticate)和权限管理(authorization)的功能。主要的实现在django.contrib.auth
包中
User对象
User
对象是身份验证系统的核心,是与网站进行交互的人员。它们被用于启用访问限制,注册用户配置文件,将内容与创建者关联等内容。只有一类的用户对象存在于身份验证系统,就是之前提到的superuser
超级用户或称之为admin
管理员。staff
用户就是一些有特殊属性的user对象。
User字段
User
定义在django.contrib.auth.models
中,它的几个字段:
usename
:由字母,下划线_, @, +,