首页 > 编程 > Python > 正文

详解Django框架中用户的登录和退出的实现

2020-01-04 17:59:32
字体:
来源:转载
供稿:网友
这篇文章主要介绍了详解Django框架中用户的登录和退出的实现,Django是重多Python人气框架中最为知名的一个,需要的朋友可以参考下
 


Django 提供内置的视图(view)函数用于处理登录和退出 (以及其他奇技淫巧),但在开始前,我们来看看如何手工登录和退出。 Django提供两个函数来执行django.contrib.auth/中的动作 : authenticate()和login()。

认证给出的用户名和密码,使用 authenticate() 函数。它接受两个参数,用户名 username 和 密码 password ,并在密码对给出的用户名合法的情况下返回一个 User 对象。 如果密码不合法,authenticate()返回None。
 

  1. >>> from django.contrib import auth 
  2. >>> user = auth.authenticate(username='john', password='secret'
  3. >>> if user is not None: 
  4. ...   print "Correct!" 
  5. ... else
  6. ...   print "Invalid password." 
?

authenticate() 只是验证一个用户的证书而已。 而要登录一个用户,使用 login() 。该函数接受一个 HttpRequest 对象和一个 User 对象作为参数并使用Django的会话( session )框架把用户的ID保存在该会话中。

下面的例子演示了如何在一个视图中同时使用 authenticate() 和 login() 函数:
 

  1. from django.contrib import auth 
  2.  
  3. def login_view(request): 
  4.   username = request.POST.get('username'''
  5.   password = request.POST.get('password'''
  6.   user = auth.authenticate(username=username, password=password) 
  7.   if user is not None and user.is_active: 
  8.     # Correct password, and the user is marked "active" 
  9.     auth.login(request, user) 
  10.     # Redirect to a success page. 
  11.     return HttpResponseRedirect("/account/loggedin/"
  12.   else
  13.     # Show an error page 
  14.     return HttpResponseRedirect("/account/invalid/"
?

注销一个用户,在你的视图中使用 django.contrib.auth.logout() 。 它接受一个HttpRequest对象并且没有返回值。
 

  1. from django.contrib import auth 
  2.  
  3. def logout_view(request): 
  4.   auth.logout(request) 
  5.   # Redirect to a success page. 
  6.   return HttpResponseRedirect("/account/loggedout/"
?

注意,即使用户没有登录, logout() 也不会抛出任何异常。

在实际中,你一般不需要自己写登录/登出的函数;认证系统提供了一系例视图用来处理登录和登出。 使用认证视图的第一步是把它们写在你的URLconf中。 你需要这样写:
 

  1. from django.contrib.auth.views import login, logout 
  2.  
  3. urlpatterns = patterns(''
  4.   # existing patterns here... 
  5.   (r'^accounts/login/$', login), 
  6.   (r'^accounts/logout/$', logout), 
?

/accounts/login/ 和 /accounts/logout/ 是Django提供的视图的默认URL。

缺省情况下, login 视图渲染 registragiton/login.html 模板(可以通过视图的额外参数 template_name 修改这个模板名称)。 这个表单必须包含 username 和 password 域。如下示例: 一个简单的 template 看起来是这样的
 

  1. {% extends "base.html" %} 
  2.  
  3. {% block content %} 
  4.  
  5.  {% if form.errors %} 
  6.   <p class="error">Sorry, that's not a valid username or password</p> 
  7.  {% endif %} 
  8.  
  9.  <form action="" method="post"
  10.   <label for="username">User name:</label> 
  11.   <input type="text" name="username" value="" id="username"
  12.   <label for="password">Password:</label> 
  13.   <input type="password" name="password" value="" id="password"
  14.  
  15.   <input type="submit" value="login" /> 
  16.   <input type="hidden" name="next" value="{{ next|escape }}" /> 
  17.  </form> 
  18.  
  19. {% endblock %} 
?

如果用户登录成功,缺省会重定向到 /accounts/profile 。 你可以提供一个保存登录后重定向URL的next隐藏域来重载它的行为。 也可以把值以GET参数的形式发送给视图函数,它会以变量next的形式保存在上下文中,这样你就可以把它用在隐藏域上了。

logout视图有一些不同。 默认情况下它渲染 registration/logged_out.html 模板(这个视图一般包含你已经成功退出的信息)。 视图中还可以包含一个参数 next_page 用于退出后重定向。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表