但凡是一个公开使用的系统,都离不开认证登录这个模块,如何快速出一个基本的认证登录页面供使用则是经常遇到的问题。好在django有一套成型的注册登录模块可供使用。如果你跟我一样不想重复造轮子,那么这篇分享或许可以帮你快速完成任务。
下面就几个关键常用的问题以FAQ的方式给出我在这块的学习总结笔记。
FAQ
Q: 使用Django自带的认证系统,大致流程是什么
默认支持的是本地认证
1、settings.py中加上auth/session等相关的中间件及APP;
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
)
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
)
2、运行 python manage.py syndb (django 1.7及以上版本,先后使用makemigrations、migrate命令替代)生成相应的表并设置管理员帐户及密码
3、urls.py 中分别加登入登出入口 url;
from django.contrib.auth.views import login, logout_then_login
url(r'^accounts/login/$', login, {'template_name': 'manage/index.html'}), # 指定登录页面模板
url(r'^accounts/logout/$', logout_then_login), # 退出登录,并跳转到登录页面
4、settings.py中加 LOGIN_URL(未通过认证时跳转的认证页面) 和 LOGIN_REDIRECT_URL (登录成功后默认跳转的页面)
5、加认证登录模板文件
{% extends "base.html" %}
{% block body %}
{% if form.errors %}
<p class="error">Sorry, that's not a valid username or password</p>
{% endif %}
<form action='.' method='post'>
{% csrf_token %}
<label for="username">User name:</label>
<input type="text" name="username" value="" id="username">
<label for="password">Password:</label>
<input type="password" name="password" value="" id="password">
<input type="submit" value="login" />
<input type="hidden" name="next" value="{{ next|escape }}" />
</form>
{% endblock %}
6、写好系统所需的视图函数即可搞定。
Q: 如何创建用户?
使用 create_user 辅助函数创建用户:
from django.contrib.auth.models import User
user = User.objects.create_user(username='',password='',email='')
user.save
Q: 如何修改密码?
root@poinx:/var/www# python manage.py shell
Python 2.7.3 (default, Dec 18 2014, 19:10:20)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.contrib.auth.models import User
>>> user = User.objects.get(username='admin')
>>> user.set_password('Nsf0cus')
>>> user.save()
>>> quit()
root@poinx:/var/www#
Q: @login_required怎么用?
在django项目中,经常会看到下面这样的代码:
from django.contrib.auth.decorators import login_required
@login_required
def my_view(request):
...
里面有一个@login_required标签。其作用就是告诉程序,使用这个方法是要求用户登录的。
1.如果用户还没有登录,默认会跳转到‘/accounts/login/’。这个值可以在settings文件中通过LOGIN_URL参数来设定。(后面还会自动加上你请求的url作为登录后跳转的地址,如: /accounts/login/?next=/polls/3/ 登录完成之后,会去请求/poll/3)
2.如果用户登录了,那么该方法就可以正常执行
如果LOGIN_URL使用默认值,那么在urls.py中还需要进行如下设置:(加入下面这句)
(r'^accounts/login/$', 'django.contrib.auth.views.login'),
这样的话,如果未登录,程序会默认跳转到“templates\registration\login.html”这个模板。
如果想换个路径,那就再加个template_name参数,如下:
(r'^accounts/login/$', 'django.contrib.auth.views.login', {'template_name': 'myapp/login.html'}),
这样程序就会跳转到templates\myapp\login.html”
Q: 如何进行第三方认证?
第三方认证,也称“外部认证”,这里以Radius认证为例。
1、设置“认证后端”列表
在settings中设置AUTHENTICATION_BACKENDS参数,默认被设置为:(‘django.contrib.auth.backends.ModelBackend’,) AUTHENTICATION_BACKENDS 的顺序是重要的,所以如果相同的用户名和密码在多个后端中同时存在, Django 会在第一个匹配的地方停止。 示例:
2、编写一个认证后端
一个认证后端是一个执行两个方法的类: get_user(user_id) 和 authenticate(**credentials) 。
get_user 方法需要一个 user_id (可以是一个用户名、数据库 ID 或其他东东),并且返回一个用户对象。
authenticate 方法有一个证书关键字参数。多数情况下看上去如下:
class MyBackend:
def authenticate(self, username=None, password=None): // 检查用户名和密码并返回一个用户。
但是也可以认证一个标志,象下面这样:
class MyBackend:
def authenticate(self, token=None): // 检查标志并返回一个用户。
以下是一个后端实例,其中radius.py提供了auth类供该后端调用:
其它说明
如果你只需要做一个Demo供展示或对认证等的要求并不高,那么以上内容足够使用。但如果涉及到用户、组、权限的管理,还需要了解更多内容,可查阅相关文档。
如果您需要了解更多内容,可以
加入QQ群:486207500
直接询问:010-68438880-8669