当前位置:K88软件开发文章中心网站服务器框架django → 文章内容

Django 会话、用户和注册

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-25 14:19:25

一般不需要自己写登录/登出的函数;认证系统提供了一系例视图用来处理登录和登出。 使用认证视图的第一步是把它们写在你的URLconf中。 你需要这样写:from django.contrib.auth.views import login, logouturlpatterns = patterns('', # existing patterns here... (r'^accounts/login/$', login), (r'^accounts/logout/$', logout),)/accounts/login/ 和 /accounts/logout/ 是Django提供的视图的默认URL。缺省情况下, login 视图渲染 registragiton/login.html 模板(可以通过视图的额外参数 template_name 修改这个模板名称)。 这个表单必须包含 username 和 password 域。如下示例: 一个简单的 template 看起来是这样的{% extends "base.html" %}{% block content %} {% if form.errors %} <p class="error">Sorry, that's not a valid username or password</p> {% endif %} <form action="" method="post"> <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 %}如果用户登录成功,缺省会重定向到 /accounts/profile 。 你可以提供一个保存登录后重定向URL的next隐藏域来重载它的行为。 也可以把值以GET参数的形式发送给视图函数,它会以变量next的形式保存在上下文中,这样你就可以把它用在隐藏域上了。logout视图有一些不同。 默认情况下它渲染 registration/logged_out.html 模板(这个视图一般包含你已经成功退出的信息)。 视图中还可以包含一个参数 next_page 用于退出后重定向。限制已登录用户的访问有很多原因需要控制用户访问站点的某部分。一个简单原始的限制方法是检查 request.user.is_authenticated() ,然后重定向到登陆页面:from django.http import HttpResponseRedirectdef my_view(request): if not request.user.is_authenticated(): return HttpResponseRedirect('/accounts/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 修饰符:from django.contrib.auth.decorators import login_required@login_requireddef my_view(request): # ...login_required 做下面的事情:如果用户没有登录, 重定向到 /accounts/login/ , 把当前绝对URL作为 next 在查询字符串中传递过去, 例如: /accounts/login/?next=/polls/3/ 。如果用户已经登录, 正常地执行视图函数。 视图代码就可以假定用户已经登录了。对通过测试的用户限制访问限制访问可以基于某种权限,某些检查或者为login视图提供不同的位置,这些实现方式大致相同。一般的方法是直接在视图的 request.user 上运行检查。 例如,下面视图确认用户登录并是否有polls.can_vote权限:def vote(request): if request.user.is_authenticated() and request.user.has_perm('polls.can_vote')): # vote here else: return HttpResponse("You can't vote in this poll.")并且Django有一个称为 user_passes_test 的简洁方式。它接受参数然后为你指定的情况生成装饰器。def user_can_vote(user): return user.is_authenticated() and user.has_perm("polls.can_vote")@user_passes_test(user_can_vote, login_url="/login/")def vote(request): # Code here can assume a logged-in user with the correct permission. ...user_passes_test 使用一个必需的参数: 一个可调用的方法,当存在 User 对象并当此用户允许查看该页面时返回True 。 注意 user_passes_test 不会自动检查 User是否认证,你应该自己做这件事。例子中我们也展示了第二个可选的参数 login_url ,它让你指定你的登录页面的URL(默认为/accounts/login/ )。 如果用户没有通过测试,那么user_passes_test将把用户重定向到login_url既然检查用户是否有一个特殊权限是相对常见的任务,Django为这种情形提供了一个捷径:permission_required() 装饰器。 使用这个装饰器,前面的例子可以改写为:from django.contrib.auth.decorators import permission_required@permission_required('polls.can_vote', login_url="/login/")def vote(request): # ...注意, permission_required() 也有一个可选的 login_url 参数, 这个参数默认为 '/accounts/login/' 。限制通用视图的访问在Django用户邮件列表中问到最多的问题是关于对通用视图的限制性访问。 为实现这个功能,你需要自己包装视图,并且在URLconf中,将你自己的版本替换通用视图:from django.contrib.auth.decorators import login_requiredfrom django.views.generic.date_based import object_detail@login_requireddef limited_object_detail(*args, **kwargs): return object_detail(*args, **kwargs)当然, 你可以用任何其他限定修饰符来替换 login_required 。管理 Users, Permissions 和 Groups管理认证系统最简单的方法是通过管理界面。 第六章讨论了怎样使用Django的管理界面来编辑用户和控制他们的权限和可访问性,并且大多数时间你使用这个界面就可以了。然而,当你需要绝对的控制权的时候,有一些低层 API 需要深入专研,我们将在下面的章节中讨论它们。创建用户使用 create_user 辅助函数创建用户:>>> from django.contrib.auth.models import User>>> user = User.objects.create_user(username='john',... email='jlennon@beatles.com',... password='glass onion')在这里, user 是 User 类的一个实例,准备用于向数据库中存储数据。(create_user()实际上没有调用save())。 create_user() 函数并没有在数据库中创建记录,在保存数据之前,你仍然可以继续修改它的属性值。>>> user.is_staff = True>>> user.save()修改密码你可以使用 set_password() 来修改密码:>>> user = User.objects.get(usern

上一页  [1] [2] [3] [4] [5] [6] [7]  下一页


Django 会话、用户和注册