django 限制用户登录

作者: admin 分类: python 发布时间: 2011-09-14 17:16 ė 6 没有评论

最简单、最原始的限制页面访问的方法是在每个页面上加入 “request.user.is_authenticated()“
并且把它重定向到登录页面。 ::

from django.http import HttpResponseRedirect

def my_view(request):
if not request.user.is_authenticated():
return HttpResponseRedirect(’/login/?next=%s’ % request.path)
#…

或者显示一条出错信息 ::

def my_view(request):
if not request.user.is_authenticated():
return render_to_response(’myapp/login_error.html’)
#…

login_required 修饰符
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

你可以使用 “login_required“ 修饰符来作为一个快捷方式 ::

from django.contrib.auth.decorators import login_required

def my_view(request):
# …
my_view = login_required(my_view)

下面是一个等价的例子,使用了Python 2.4的decorator样式 ::

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
# …

“login_required“ 作下面这些事情:

* 如果用户没有登录,那么重定向到 “/accounts/login/“ ,传入当前的绝对URL路径作为
query string “next“ 的值。例如: “/accounts/login/?next=/polls/3/“ 。
* 如果用户已经登录了,那么就正常执行view的代码。

请注意,你需要映射正确的处理登录用的视图(view)到 “/accounts/login/“ 。
把下面的行加入到你的URLconf中::

(r’^accounts/login/$’, ‘django.contrib.auth.views.login’),

“django.contrib.auth.views.login“ 的作用是::

* 如果通过 “GET“ 方式调用的话, 它显示一个登录表单并通过POST的方式登录。

* 如果通过 “POST“ 方式调用的话,它试图把用户登录进去。 如果登录成功,
视图(view)重定向到 “/accounts/profile/“ (目前是硬性编码的,就是写死的。)。
如果登录失败,则继续显示登录表单。

你需要自己提供一个登录表单的模版,默认叫 “registration/login.html“ 。
这个模版需要获得3个模版上下文的变量:

* “form“: 一个 “FormWrapper“ 对象,用来显示登录表单。
更多请看“FormWrapper“ 对象的 `forms documentation`_ 。
* “next“: 登录成功后重定向的URL。也可能包含一个查询字符串。
* “site_name“: 当前 “Site“ 的名字。根据 “SITE_ID“ 设置的信息获取。
参考 `site framework docs`_ 。

如果你不想使用 “registration/login.html“ 这个模版,你可以为在URLconf中的视图(view)传入
一个 “template_name“ 作为扩展的参数。 ::

(r’^accounts/login/$’, ‘django.contrib.auth.views.login’, {’template_name’: ‘myapp/login.html’}),

下面是一个 “registration/login.html“ 的例子,你可以以它为基础来开始你的工作。
它扩展自 “base.html“ 并且定义了一个 “content“ 块::

{% extends “base.html” %}

{% block content %}

{% if form.has_errors %}

用户名和密码不匹配。请重试。

{% endif %}

{{ form.username }}
{{ form.password }}



{% endblock %}

.. _forms documentation: http://www.djangoproject.com/documentation/forms/
.. _site framework docs: http://www.djangoproject.com/documentation/sites/

已登录用户通过通行测试(pass test)来限制访问
―――――――――――――――――

为了实现基于特定的权限或其他的测试的访问限制,你应该做同上一节一样的基本事情。
To limit access based on certain permissions or some other test, you’d do
essentially the same thing as described in the previous section.

简单的方法是在view中直接运行测试 “request.user“ 的代码。
例如,这个view检测并确认用户已经登陆并且拥有 “polls.can_vote“ 的权限。 ::

def my_view(request):
if not (request.user.is_authenticated() and request.user.has_perm(’polls.can_vote’)):
return HttpResponse(”你不能投票。”)
# …

你可以使用 “user_passes_test“ 作为快捷方式 ::

from django.contrib.auth.decorators import user_passes_test

def my_view(request):
# …
my_view = user_passes_test(lambda u: u.has_perm(’polls.can_vote’))(my_view)

Python 2.4的写法 ::

from django.contrib.auth.decorators import user_passes_test

@user_passes_test(lambda u: u.has_perm(’polls.can_vote’))
def my_view(request):
# …

“user_passes_test()“ 需要一个必须的参数: 一个包含 “User“ 的可调用的对象,如果
用户被允许察看这个页面的话,返回 “True“ 。
注意,如果 “User“ 不是匿名的话, “user_passes_test“ 并不自动监测。

“user_passes_test()“ 需要一个可选的 “login_url“ 参数, 它可以让你指定登录表单
的URL(默认是 “/accounts/login/“ )。

例子,Python 2.3写法 ::

from django.contrib.auth.decorators import user_passes_test

def my_view(request):
# …
my_view = user_passes_test(lambda u: u.has_perm(’polls.can_vote’), login_url=’/login/’)(my_view)

例子,Python 2.4写法 ::

from django.contrib.auth.decorators import user_passes_test

@user_passes_test(lambda u: u.has_perm(’polls.can_vote’), login_url=’/login/’)
def my_view(request):
# …

限制访问 generic views
―――――――C

为了限制访问 `generic view`_, 可以为view写一个包装器,并且在URLconf中指定为它。

例如 ::

from django.views.generic.date_based import object_detail

@login_required
def limited_object_detail(*args, **kwargs):
return object_detail(*args, **kwargs)

本文出自 小Q,转载时请注明出处及相应链接。

本文永久链接: http://www.linuxqq.com/archives/771.html

0
更多
Ɣ回顶部