一、 Django的认证系统

Django自带一个用户认证系统,用于处理用户账户、群组、许可和基于cookie的用户会话。

1.1 概览

Django的认证系统包含了身份验证和权限管理两部分。简单地说,身份验证用于核实某个用户是否是合法用户,权限管理则是决定一个合法用户具有哪些权限。这里,“身份验证”这个词同时代指上面两部分的含义。

系统主要包括:

  • 用户
  • 许可
  • 可配置的密码哈希系统
  • 用于用户登录或者限制访问的表单和视图工具
  • 可插拔的后端

类似下面的问题,请使用第三方包:

  • 密码强度检查
  • 登录请求限制
  • 第三方认证

1.2 安装

默认情况下,使用django-admin startproject命令后,认证相关的模块已经自动添加到settings文件内了,如果没有的话,请手动添加。

在 INSTALLED_APPS配置项中:

  1. 'django.contrib.auth': 包含认证框架的核心以及默认模型
  2. 'django.contrib.contenttypes':内容类型系统,用于给模型关联许可

在MIDDLEWARE配置项中:

  1. SessionMiddleware:通过请求管理会话
  2. AuthenticationMiddleware:将会话和用户关联

当配置正确后,运行manage.py migrate命令,创建用户认证系统相关的数据库表以及分配预定义的权限。

二、 使用Django的认证系统

2.1 用户对象

默认的用户包含下面的属性:

  • username
  • password
  • email
  • first_name
  • last_name

2.1.1 创建用户

最直接的办法是使用 create_user()功能:

>>> from django.contrib.auth.models import User
>>> user = User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')
# 这时,user是一个User类的实例,已经保存在了数据库内,你可以随时修改它的属性,例如:
>>> user.last_name = 'Lennon'
>>> user.save()

如果你已经启用了Django的admin站点,你也可以在web页面上创建用户。

2.1.2 创建超级用户

使用createsuperuser命令

$ python manage.py createsuperuser --username=joe --email=joe@example.com

根据提示输入名字、密码和邮箱地址。

2.1.3 修改密码

Django默认会对密码进行加密,因此,不要企图对密码进行直接操作。这也是为什么要使用一个帮助函数来创建用户的原因。

要修改密码,有两个办法:

  1. 使用命令行: manage.py changepassword username。如果不提供用户名,则会尝试修改当前系统用户的密码。
  2. 使用set_password()方法:
from django.contrib.auth.models import User
u = User.objects.get(username='john')
u.set_password('new password')
u.save()

同样可以在admin中修改密码。
Django提供了views和forms,方便用户自己修改密码。
修改密码后,用户的所有当前会话将被注销。

2.1.4 用户验证

authenticate(**credentials)[source]:

通常接收username与password作为参数进行认证。在认证后端中,有一项通过则返回一个User类对象,一项都没通过或者抛出了PermissionDenied异常,则返回一个None。例如:

from django.contrib.auth import authenticate
user = authenticate(username='john', password='secret')
if user is not None:
# A backend authenticated the credentials
else:
# No backend authenticated the credentials

2.2 权限与授权

Django提供了一个权限系统用于它的admin站点,当然你也可以在你的代码中使用。
使用方法:

  • 必须有“add”授权的用户才可以访问add页面
  • 必须有“change”授权的用户才可以访问change list页面
  • 必须有“delete”授权的用户才可以删除对象

ModelAdmin类提供了 has_add_permission(),has_change_permission()和has_delete_permission()三个方法。User表的对象有两个多对多的字段,groups和user_permissions,可以像普通的model一样访问他们。

myuser.groups.set([group_list])
myuser.groups.add(group, group, ...)
myuser.groups.remove(group, group, ...)
myuser.groups.clear()
myuser.user_permissions.set([permission_list])
myuser.user_permissions.add(permission, permission, ...)
myuser.user_permissions.remove(permission, permission, ...)
myuser.user_permissions.clear()

2.2.1 默认权限

默认情况下,使用manage.py migrate命令时,Django会给每个已经存在的model添加默认的权限。
假设你现在有个app叫做foo,有个model叫做bar,使用下面的方式可以测试默认权限:

add: user.has_perm('foo.add_bar')
change: user.has_perm('foo.change_bar')
delete: user.has_perm('foo.delete_bar')

2.2.2 组

Django提供了一个django.contrib.auth.models.Group模型,该model可用于给用户分组,实现批量管理。用户和组属于多对多的关系。用户自动具有所属组的所有权限。

2.2.3 在代码中创建权限

例如,你可以为myapp中的BlogPost模型添加一个can_publish权限。

from myapp.models import BlogPost
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType content_type = ContentType.objects.get_for_model(BlogPost)
permission = Permission.objects.create(
codename='can_publish',
name='Can Publish Posts',
content_type=content_type,
)

然后,你可以通过User模型的user_permissions属性或者Group模型的permissions属性为用户添加该权限。

2.2.4 权限缓存

权限检查后,会被缓存在用户对象中。参考下面的例子:

from django.contrib.auth.models import Permission, User
from django.shortcuts import get_object_or_404 def user_gains_perms(request, user_id):
user = get_object_or_404(User, pk=user_id)
# any permission check will cache the current set of permissions
user.has_perm('myapp.change_bar') permission = Permission.objects.get(codename='change_bar')
user.user_permissions.add(permission) # Checking the cached permission set
user.has_perm('myapp.change_bar') # False # Request new instance of User
# Be aware that user.refresh_from_db() won't clear the cache.
user = get_object_or_404(User, pk=user_id) # Permission cache is repopulated from the database
user.has_perm('myapp.change_bar') # True ...

2.3 在Web请求中的认证

Django使用session和中间件在请求对象中钩住认证系统。

每一次请求中都包含一个request.user属性。如果该用户未登陆,该属性的值是AnonymousUser,如果已经登录,该属性就是一个User模型的实例。

可以使用is_authenticated方法进行判断,如下:

if request.user.is_authenticated:
# Do something for authenticated users.
...
else:
# Do something for anonymous users.
...

2.3.1 如何登录用户

login(request, user, backend=None)[source]:

在视图中,使用login()方法登录用户。它接收一个HttpRequest参数和一个User对象参数。该方法会把用户的ID保存在Django的session中。下面是一个认证和登陆的例子:

from django.contrib.auth import authenticate, login

def my_view(request):
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
if user is not None:
login(request, user)
# 跳转到成功页面
...
else:
# 返回一个非法登录的错误页面
...

2.3.2 如何注销用户

logout(request)[source]:

from django.contrib.auth import logout

def logout_view(request):
logout(request)
# Redirect to a success page.

注意,被logout的用户如何没登录,不会抛出错误。
一旦logout,当前请求中的session数据都会被清空。

2.3.3 登陆用户访问限制

原始的办法

在request.user.is_authenticated中重定向到登录页面,如下所示:

from django.conf import settings
from django.shortcuts import redirect def my_view(request):
if not request.user.is_authenticated:
return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
# ...

或者显示一个错误信息:

from django.shortcuts import render

def my_view(request):
if not request.user.is_authenticated:
return render(request, 'myapp/login_error.html')
# ...

使用装饰器

login_required(redirect_field_name='next', login_url=None)[source]

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
...

该装饰器工作机制:

  • 如果用户未登陆,重定向到settings.LOGIN_URL,传递当前绝对路径作为url字符串的参数,例如:/accounts/login/?next=/polls/3/
  • 如果用户已经登录,执行正常的视图

此时,默认的url中使用的参数是“next”,如果你想使用自定义的参数,请修改login_required()的redirect_field_name参数,如下所示:

from django.contrib.auth.decorators import login_required

@login_required(redirect_field_name='my_redirect_field')
def my_view(request):
...

如果你这么做了,你还需要重新定制登录模板,因为它引用了redirect_field_name变量。

login_required()方法还有一个可选的longin_url参数。例如:

from django.contrib.auth.decorators import login_required

@login_required(login_url='/accounts/login/')
def my_view(request):
...

注意:如果不指定login_url参数,请确保你的settings.LOGIN_URL和登陆视图保持正确的关联。例如:

from django.contrib.auth import views as auth_views
url(r'^accounts/login/$', auth_views.login),

使用LoginRequired mixin

通过继承LoginRequiredMixin类的方式。
在多继承时,该类必须是最左边的父类。
class LoginRequiredMixin(New in Django 1.9.)

根据raise_exception参数的不同,对于未登陆的用户请求,响应不同的结果。

from django.contrib.auth.mixins import LoginRequiredMixin

class MyView(LoginRequiredMixin, View):
login_url = '/login/'
redirect_field_name = 'redirect_to'

进行测试,根据结果决定动作

你也可以直接在视图中进行过滤:

from django.shortcuts import redirect

def my_view(request):
if not request.user.email.endswith('@example.com'):
return redirect('/login/?next=%s' % request.path)
# ...
  • user_passes_test(test_func,login_url=None,redirect_field_name='next')[source]
    该装饰器当调用的返回值是Fasle的时候重定向。
from django.contrib.auth.decorators import user_passes_test

def email_check(user):
return user.email.endswith('@example.com') @user_passes_test(email_check)
def my_view(request):
...

对于上面的例子,email_check接收一个User对象作为参数,当其返回值是True时,允许执行下面的my_view视图,否则不允许。

user_passes_test()有两个可选的参数:login_url和redirect_field_name。前者是跳转的url后者是url参数字符串。例如:

@user_passes_test(email_check, login_url='/login/')
def my_view(request):
...
  • class UserPassesTestMixin

继承该类,重写test_func()方法:

from django.contrib.auth.mixins import UserPassesTestMixin

class MyView(UserPassesTestMixin, View):

    def test_func(self):
return self.request.user.email.endswith('@example.com')

也可以重写get_test_func()方法,指定自定义的名称用于替代默认的test_func。

权限需求装饰器

permission_required(perm, login_url=None, raise_exception=False)[source]

from django.contrib.auth.decorators import permission_required

@permission_required('polls.can_vote')
def my_view(request):
...

类似has_perm()方法。权限的格式是<app label>.<permission codename>

可选的longin_url参数:

from django.contrib.auth.decorators import permission_required

@permission_required('polls.can_vote', login_url='/loginpage/')
def my_view(request):
...

raise_exception参数如果给予,装饰器会抛出PermissionDenied异常,并且用403页面代替重定向的登陆页面。例如:

from django.contrib.auth.decorators import login_required, permission_required

@login_required
@permission_required('polls.can_vote', raise_exception=True)
def my_view(request):
...

PermissionRequiredMixin类

同上面的loginrequiredmixin类似。

from django.contrib.auth.mixins import PermissionRequiredMixin

class MyView(PermissionRequiredMixin, View):
permission_required = 'polls.can_vote'
# Or multiple of permissions:
permission_required = ('polls.can_open', 'polls.can_edit')

可以自定义重写get_permission_required()和has_permission()方法

2.3.4 在基于类的视图中重定向未授权的请求

class AccessMixin:

  • login_url
    get_login_url()方法的默认回调函数。

  • permission_denied_message
    拒绝访问的提示信息。默认是空字符串。

  • redirect_field_name
    get_redirect_field_name()的返回值. 默认是"next".

  • raise_exception
    抛出异常。默认为False。

  • get_login_url()

  • get_permission_denied_message()

  • get_redirect_field_name()

  • handle_no_permission()¶

2.3.5 认证视图

Django没有为认证视图提供默认的模板,你需要自己创建。

使用视图

有很多种办法实现这些视图,最简单的是使用Django提供的django.contrib.auth.urls,将它添加到URLconf文件中:

urlpatterns = [
url('^', include('django.contrib.auth.urls')),
]

这就相当于添加了下面的URL模式:

^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<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$ [name='password_reset_confirm']
^reset/done/$ [name='password_reset_complete']

其中,方括号里的是url的别名。
当然,也可以使用自定义的URL,例如:

from django.contrib.auth import views as auth_views

urlpatterns = [
url('^change-password/$', auth_views.password_change),
]

这些views有一些可选的参数。例如template_name,用于指定视图需要使用的html模板,看下面的例子:

urlpatterns = [
url(
'^change-password/$', auth_views.password_change,
{'template_name': 'change-password.html'}
),
]

所有的这类views都返回一个TemplateResponse实例,对于自定义views可以将Django提供的view封装起来使用,例如:

from django.contrib.auth import views

def change_password(request):
template_response = views.password_change(request)
# Do something with `template_response`
return template_response

所有的认证视图

下面是django.contrib.auth模块包含的所有视图:

login(request, template_name=registration/login.html, redirect_field_name='next', authentication_form=AuthenticationForm, current_app=None, extra_context=None, redirect_authenticated_user=False)

登录视图

URL name:login (该视图对应的访问地址,下同)

可选参数:

template_name: 登录页面html文件名。默认为registration/login.html。

redirect_field_name: 用于登录URL路径的参数关键字,默认是“next”。

authentication_form:用于认证的调用,默认是AuthenticationForm。

current_app: 2.0版本中将被移除,用request.current_app代替。

extra_context: 额外的数据字典

redirect_authenticated_user:一个布尔值,用于控制已登陆用户是否可以访问登录页面。默认是False。

django.contrib.auth.views.login视图的工作机制是:
使用GET请求时,显示一个登陆表单,用户可以输入登录信息。
使用POST请求时,携带用户提供的登陆信息,进行用户验证。如果验证成功,重定向到next参数指定的url地址(如果未指定next参数,则使用settings.LOGIN_REDIRECT_URL中配置的地址,该地址默认为/accounts/profile/),如果不成功,继续显示表单页面。

Django不提供registration/login.html模板文件,需要自己编写。该模板有4个环境变量:

  1. form:一个表示AuthenticationForm的Form对象
  2. next:登录成功后重定向的url地址
  3. site:当前的Site,根据SITE_ID设置。如果没有安装site框架,则被设置为一个RequestSite的实例,它将从HttpRequest中导出site名和域名。
  4. site_name:site.name的别名。如果没安装site框架,它将被设置为request.META['SERVER_NAME']的值。

也可以不使用默认的registration/login.html模板,而是指定别的模板,使用template_name参数,如下:

url(r'^accounts/login/$', auth_views.login, {'template_name': 'myapp/login.html'}),

这里有一个registration/login.html模板的简单例子(假定你已经有了base.html文件)。

{% extends "base.html" %}

{% block content %}

{% if form.errors %}
<p>Your username and password didn't match. Please try again.</p>
{% endif %} {% if next %}
{% if user.is_authenticated %}
<p>Your account doesn't have access to this page. To proceed,
please login with an account that has access.</p>
{% else %}
<p>Please login to see this page.</p>
{% endif %}
{% 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 %}

如果使用自定义认证系统,可以通过authentication_form参数,指定你自定义的认证form显示在登录页面中。这个form必须接受一个request关键字参数在它的__init__方法中,并且提供一个get_user()方法用于返回通过认证的user对象。

logout(request, next_page=None, template_name='registration/logged_out.html', redirect_field_name='next', current_app=None, extra_context=None)

注销视图

URL name: logout
可选参数:

  • next_page: 注销后跳转的页面。默认是settings.LOGOUT_REDIRECT_URL。
  • template_name: 注销后跳转的页面html文件.默认是registration/logged_out.html
  • redirect_field_name: 同上
  • current_app: 同上
  • extra_context:同上

模板变量:

  • title:字符串“Logged out”
  • site:同上
  • site_name:同上
logout_then_login(request, login_url=None, current_app=None, extra_context=None)

注销用户,并返回登录页面。

URL name:未设置

可选参数:

  • login_url:同上
  • current_app: 同上
  • extra_context:同上
password_change(request, template_name='registration/password_change_form.html', post_change_redirect=None, password_change_form=PasswordChangeForm, current_app=None, extra_context=None)¶

用户修改密码的页面

URL name:password_change

可选参数:

  • template_name:用于显示修改密码表单的页面文件。默认是registration/password_change_form.html。
  • post_change_redirect:成功修改后跳转的url
  • password_change_form:自定义的“change password”表单,它必须接收一个user关键字参数。默认为PasswordChangeForm。
  • current_app: 同上
  • extra_context:同上

模板变量:

  • form:修改密码的表单
password_change_done(request, template_name='registration/password_change_done.html', current_app=None, extra_context=None)

用户修改完密码后的页面。

URL name: password_change_done

可选参数:

  • template_name:用于显示修改密码表单的页面文件。默认是registration/password_change_form.html。
  • current_app: 同上
  • extra_context:同上
password_reset(request, template_name='registration/password_reset_form.html', email_template_name='registration/password_reset_email.html', subject_template_name='registration/password_reset_subject.txt', password_reset_form=PasswordResetForm, token_generator=default_token_generator, post_reset_redirect=None, from_email=None, current_app=None, extra_context=None, html_email_template_name=None, extra_email_context=None)¶

生成一个一次性的连接,并将该连接发送到用户注册的邮箱地址,用户通过改地址重置他的密码。

为了防止潜在的攻击,如果提供的邮件地址在系统中不存在,视图不会发送邮件,用户也不会受到任何的错误信息提示。如果想要提供错误信息的话,继承PasswordResetForm类,并使用password_reset_form参数。

URL name: password_reset

可选参数:

  • template_name: 同上。默认是registration/password_reset_form.html。
  • email_template_name:发送携带重置密码连接的邮件的页面。默认是registration/password_reset_email.html。
  • subject_template_name:邮件的主题,默认是registration/password_reset_subject.txt。
  • password_reset_form: 同上
  • token_generator:检查一次性连接的类的实例。默认是default_token_generator,它是django.contrib.auth.tokens.PasswordResetTokenGenerator的一个实例。
  • post_reset_redirect: 同上
  • from_email: 发件人地址。默认是DEFAULT_FROM_EMAIL。
  • current_app: 同上
  • extra_context:同上
  • html_email_template_name: 默认情况下HTML email不发送。
  • extra_email_context: email模板中额外的数据字典。

模板变量:

  • form:同上

email模板变量:

  • email:user.email的别名
  • user:当前user。只有有效的用户才可以重置他们的密码(User.is_active is True)。
  • site_name:同上
  • domain:site.domain的别名。如果没有安装site框架,则为request.get_host()。
  • protocol: http或者https协议
  • uid: 用户的主键,基于64位。
  • token: 用于检查重置连接合法性的令牌

一个简单的registration/password_reset_email.html文件范例:

Someone asked for password reset for email {{ email }}. Follow the link below:
{{ protocol}}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %}
password_reset_done(request, template_name='registration/password_reset_done.html', current_app=None, extra_context=None)

密码重置后的跳转页面
URL name: password_reset_done

可选参数:

  • template_name: 同上。默认是registration/password_reset_done.html。
  • current_app: 同上
  • extra_context:同上
password_reset_confirm(request, uidb64=None, token=None, template_name='registration/password_reset_confirm.html', token_generator=default_token_generator, set_password_form=SetPasswordForm, post_reset_redirect=None, current_app=None, extra_context=None)

显示一个输入新密码的表单

URL name: password_reset_confirm

可选参数:

  • uidb64: 同上,默认为None。
  • token: 检查密码是否合法的令牌,默认为None.
  • template_name: 同上,默认为registration/password_reset_confirm.html.
  • token_generator: 同上
  • set_password_form: 用于设置密码的表单。默认为SetPasswordForm。
  • post_reset_redirect: 同上,默认为None。
  • current_app: 同上
  • extra_context: 同上

模板变量:

  • form: 同上
  • validlink: 布尔值。链接合法则为True。
password_reset_complete(request, template_name='registration/password_reset_complete.html', current_app=None, extra_context=None)

提示用户密码已经成功修改

URL name: password_reset_complete

可选参数:

  • template_name: 同上,默认为registration/password_reset_confirm.html.
  • current_app: 同上
  • extra_context: 同上

2.3.6 有用的函数

redirect_to_login(next, login_url=None, redirect_field_name='next')

重定向到登录页面,登录成功后跳转到指定的url。

必须参数:next,登录成功后跳转的url
可选参数:longin_url和redirect_field_name

2.3.7 内置表单

如果你不想使用内置的视图,但又不想编写表单,认证系统提供了内置的表单供你直接使用,它们位于django.contrib.auth.forms。

class AdminPasswordChangeForm

admin中用于修改用户密码的表单。user是它的第一位置参数。

class AuthenticationForm

登录表单,request是它的第一位置参数。

confirm_login_allowed(user):默认情况下,它拒绝is_active标识为False的用户。要修改这个规则,你需要继承AuthenticationForm类,并重写confirm_login_allowed()方法。如果给予的用户没有登录,它应该抛出一个ValidationError异常。

例如,允许所有用户登录,不管它是否active:

from django.contrib.auth.forms import AuthenticationForm

class AuthenticationFormWithInactiveUsersOkay(AuthenticationForm):
def confirm_login_allowed(self, user):
pass

或者只允许某些状态的用户登录:

class PickyAuthenticationForm(AuthenticationForm):
def confirm_login_allowed(self, user):
if not user.is_active:
raise forms.ValidationError(
_("This account is inactive."),
code='inactive',
)
if user.username.startswith('b'):
raise forms.ValidationError(
_("Sorry, accounts starting with 'b' aren't welcome here."),
code='no_b_users',
)

class PasswordChangeForm

用户修改自己密码的表单

class PasswordResetForm

一个表单,用于生成和发送带有一次性连接的邮件,帮助用户重置密码。

send_email(subject_template_name, email_template_name, context, from_email, to_email, html_email_template_name=None)

发送邮件的方法。
参数:

  • subject_template_name – 主题模板
  • email_template_name – 邮件主题模板
  • context – 传递给subject_template, email_template和html_email_template 的数据
  • from_email – 发件人
  • to_email – 收件人
  • html_email_template_name

class SetPasswordForm

设置密码的表单

class UserChangeForm

admin中修改用户信息和权限的表单

class UserCreationForm

创建新用户的ModelForm。它有3个字段,username、password1和password2.

2.3.8 模板中的认证数据

用户

渲染一个RequestContext模板时,当前已登陆的用户,或者一个User实例,或者一个 AnonymousUser实例,都被保存在模板的变量{{ user }}中。例如:

{% if user.is_authenticated %}
<p>Welcome, {{ user.username }}. Thanks for logging in.</p>
{% else %}
<p>Welcome, new user. Please log in.</p>
{% endif %}

如果不是使用的RequestContext,这些变量将不可用。

权限

当前登陆用户的权限保存在模板变量 {{ perms }}中。它是一个django.contrib.auth.context_processors.PermWrapper的实例。

对于{{ perms }}对象,单级属性查询相当于User.has_module_perms的功能。例如:
{{ perms.foo }},如果登陆用户有任何foo的权限,该变量就等于True。

双级属性查询相当于User.has_perm。例如:{{ perms.foo.can_vote }}

因此,你可以在if语句中使用它们,如下面的例子所示:

{% if perms.foo %}
<p>You have permission to do something in the foo app.</p>
{% if perms.foo.can_vote %}
<p>You can vote!</p>
{% endif %}
{% if perms.foo.can_drive %}
<p>You can drive!</p>
{% endif %}
{% else %}
<p>You don't have permission to do anything in the foo app.</p>
{% endif %}

还可以使用关键字“in”,进行范围判断:

{% if 'foo' in perms %}
{% if 'foo.can_vote' in perms %}
<p>In lookup works, too.</p>
{% endif %}
{% endif %}

2.4 在admin站点中管理用户

当django.contrib.admin与django.contrib.auth都被安装时,可以在admin站点中方便的对用户、组和权限进行管理。

转载自:http://www.cnblogs.com/feixuelove1009/p/6253553.html

Django Authentication 用户认证系统的更多相关文章

  1. Django自定义用户认证系统Customizing authentication

    扩展已有的用户模型Extending the existing User model 有两种方法来扩展默认的User Model而不用重写自己的模型.如果你不需要改变存储在数据库中的字段,而只是需要改 ...

  2. Django自定义用户认证系统之自定义用户模型

    参考文档:http://python.usyiyi.cn/django/topics/auth/customizing.html Django 自带的认证系统足够应付大多数情况,但你或许不打算使用现成 ...

  3. django用户认证系统——拓展 User 模型

    Django 用户认证系统提供了一个内置的 User 对象,用于记录用户的用户名,密码等个人信息.对于 Django 内置的 User 模型, 仅包含以下一些主要的属性: username,即用户名 ...

  4. django用户认证系统——拓展 User 模型2

    Django 用户认证系统提供了一个内置的 User 对象,用于记录用户的用户名,密码等个人信息.对于 Django 内置的 User 模型, 仅包含以下一些主要的属性: username,即用户名 ...

  5. “Django用户认证系统”学习资料收集

    首推追梦人物——Django用户认证系统 待续……

  6. django用户认证系统——重置密码7

    当用户不小心忘记了密码时,网站需要提供让用户找回账户密码的功能.在示例项目中,我们将发送一封含有重置用户密码链接的邮件到用户注册时的邮箱,用户点击收到的链接就可以重置他的密码,下面是具体做法. 发送邮 ...

  7. django用户认证系统——修改密码6

    再此之前我们已经完成了用户登录.注册.注销等功能,接下来让我们继续为用户提供修改密码的功能.该功能 Django 的 auth 应用也已经为我们提供,过程几乎和之前的登录功能完全一样. 编写修改密码模 ...

  8. django用户认证系统——登录4

    用户已经能够在我们的网站注册了,注册就是为了登录,接下来我们为用户提供登录功能.和注册不同的是,Django 已经为我们写好了登录功能的全部代码,我们不必像之前处理注册流程那样费劲了.只需几分钟的简单 ...

  9. django用户认证系统——基本设置1

    网站提供登录.注册等用户认证功能是一个常见的需求.因此,Django 提供了一套功能完整的.灵活的.易于拓展的用户认证系统:django.contrib.auth.在本教程中,我将向你展示 auth ...

随机推荐

  1. ZJOI2018 D1

    归途的车上满是悲伤的气息 虽然早就预言到D1会滚粗,但一切都结束之后还是特别难过. 延时15min 50min T1 30pts 1.5h T2 10pts 2.5h T1 50pts 4.5h T3 ...

  2. 洛谷 P1233 木棍加工 解题报告

    P1233 木棍加工 题目描述 一堆木头棍子共有n根,每根棍子的长度和宽度都是已知的.棍子可以被一台机器一个接一个地加工.机器处理一根棍子之前需要准备时间.准备时间是这样定义的: 第一根棍子的准备时间 ...

  3. C#调用GDI+1.1中的函数实现高斯模糊、USM锐化等经典效果。

    http://www.cnblogs.com/Imageshop/archive/2012/12/13/2815712.html 在GDI+1.1的版本中,MS加入不少新的特性,其中的特效类Effec ...

  4. C/C++中如何计算程序运行的时间

    一个程序的功能通常有很多种方法来实现,怎么样的程序才算得上最优呢?举个例子,如果实现同一个功能的两个程序,一个一点按钮就给出运行结果,而另一个则需要漫长的时间去等待,就像安装WINDOWS XP一样( ...

  5. array_uintersect、array_uintersect_assoc、array_uintersect_uassoc 的使用方法

    和 array_intersect 类似,只不过 array_uintersect* 系列函数的值比较使用自定义函数: 键的比较,array_uintersect.array_uintersect_a ...

  6. 000. 规范类的设计(ing)

    1.变量命名规范 变量命名有许多约定俗成的规范,下面的这些规范能有效提高程序的可读性: 标识符要能体现实际含义(顾名思义). 变量名一般用小写字母,如index,不要使用Index或INDEX. 用户 ...

  7. C++ ------ 互斥锁、原子操作的性能测试

    atomic原子操作:是在新标准C++11,引入了原子操作的概念,并通过这个新的头文件提供了多种原子操作数据类型,例如,atomic_bool,atomic_int等等 测试程序 #include & ...

  8. gitlab之邮箱配置

    一.gitlab配置邮件通知功能 编辑/etc/gitlab/gitlab.rb 文件   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #配置如下   gitlab_rai ...

  9. Android通过php插入查询SQL数据库

    PHP代码 <?php header("Content-type: text/html; charset=gb2312"); $serverName = "loca ...

  10. JAVA多线程提高二:传统线程的互斥与同步&传统线程通信机制

    本文主要是回顾线程之间互斥和同步,以及线程之间通信,在最开始没有juc并发包情况下,如何实现的,也就是我们传统的方式如何来实现的,回顾知识是为了后面的提高作准备. 一.线程的互斥 为什么会有线程的互斥 ...