但凡是一个公开使用的系统,都离不开认证登录这个模块,如何快速出一个基本的认证登录页面供使用则是经常遇到的问题。好在django有一套成型的注册登录模块可供使用。如果你跟我一样不想重复造轮子,那么这篇分享或许可以帮你快速完成任务。
下面就几个关键常用的问题以FAQ的方式给出我在这块的学习总结笔记。
默认支持的是本地认证
1、settings.py中加上auth/session等相关的中间件及APP;
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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;
|
1 2 3 4 |
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、加认证登录模板文件
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
{% 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、写好系统所需的视图函数即可搞定。
使用 create_user 辅助函数创建用户:
|
1 2 3 4 |
from django.contrib.auth.models import User user = User.objects.create_user(username='',password='',email='') user.save |
|
1 2 3 4 5 6 7 8 9 10 11 12 |
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# |
在django项目中,经常会看到下面这样的代码:
|
1 2 3 4 5 |
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中还需要进行如下设置:(加入下面这句)
|
1 2 |
(r'^accounts/login/$', 'django.contrib.auth.views.login'), |
这样的话,如果未登录,程序会默认跳转到“templates\registration\login.html”这个模板。
如果想换个路径,那就再加个template_name参数,如下:
|
1 2 |
(r'^accounts/login/$', 'django.contrib.auth.views.login', {'template_name': 'myapp/login.html'}), |
这样程序就会跳转到templates\myapp\login.html”
第三方认证,也称“外部认证”,这里以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