在講完註冊模塊以後,咱們來着手實現登陸和註銷模塊。html
21.添加登陸模塊 django
註冊功能作好了,接下來咱們來完成登陸模塊。小程序
如下是咱們要完成的工做:瀏覽器
咱們先來搞定登陸視圖。ide
編輯rango/views.py,添加如下內容:post
rango/views.py:ui
def user_login(request): # 若是是HTTP POST請求,則嘗試取出相關的數據 if request.method == 'POST': # 獲取用戶提供的用戶名和密碼,這些信息包含在登陸表單中 username = request.POST['username'] password = request.POST['password'] # 驗證用戶名和密碼,驗證經過將返回一個user對象. user = authenticate(username=username, password=password) # 若驗證經過 if user: # 檢查帳戶是否已激活(可能會被禁用). if user.is_active: # 若是用戶帳戶有效且已激活,可容許用戶登陸。 # 咱們將引導用戶回到首頁. login(request, user) return HttpResponseRedirect('/rango/') else: # 用戶帳戶被禁用,則彈出警告信息! return HttpResponse("Your Rango account is disabled.") else: # 驗證不經過,則不容許用戶登陸 print ("Invalid login details: {0}, {1}".format(username, password)) return HttpResponse("Invalid login details supplied.") # 非 HTTP POST請求, 則顯示登陸表單. else: # 沒有要傳送到模板系統的變量,因此直接傳一個空的字典對象 return render(request, 'rango/login.html', {})
最後,別忘了在文件頭部加入如下代碼:url
from django.contrib.auth import authenticate, login from django.http import HttpResponseRedirect, HttpResponse
接下來建立登陸模板,建立templates/rango/login.html,加入以下內容:spa
templates/rango/login.html:rest
{% extends 'rango/base.html' %} {% block body_block %} <div class="hero-unit"> <h1>登陸Rango</h1> <div class="container"> <form class="form-signin span4" id="login_form" method="post" action="/rango/login/"> <h2 class="form-signin-heading">請登陸</h2> {% csrf_token %} {% if bad_details %} <p><strong>您輸入的用戶名或密碼錯誤!</strong></p> {% elif disabled_account %} <p><strong>您的Rango帳戶已被禁用,暫不能登陸!</strong></p> {% endif %} 用戶名: <input type="text" class="input-block-level" placeholder="用戶名" name="username" value="" size="50" /> <br /> 密碼: <input type="password" class="input-block-level" placeholder="密碼" name="password" value="" size="50" /> <br /> <button class="btn btn-primary" type="submit">登陸</button> </form> </div> <!-- /container --> </div> {% endblock %}
視圖和模板都好了,接下來咱們來處理URL映射,把它們都連到一塊兒。編輯rango/urls.py,改爲下面這樣:
rango/urls.py:
from django.conf.urls import patterns, url from rango import views urlpatterns = patterns('', url(r'^$', views.index, name='index'), url(r'^about/$', views.about, name='about'), url(r'^category/(?P<category_name_slug>\w+)$', views.category, name='category'), url(r'^add_category/$', views.add_category, name='add_category'), url(r'^category/(?P<category_name_slug>\w+)/add_page/$', views.add_page, name='add_page'), url(r'^register/$', views.register, name='register'), url(r'^login/$', views.user_login, name='login'), )
最後一步,咱們要在首頁模板(templates/rango/index.html)中添加一個「登陸」連接。請在</body>標籤前添加如下內容:
templates/rango/index.html:
<a href="/rango/login/">登陸</a><br />
搞完以上這些,趕腳還有些意猶未盡。我想讓Rango更人性化一些,在用戶登陸後來一句問候語。
繼續修改首頁模板,找到這句:
templates/rango/index.html:
<h1>歡迎來到Rango!</h1>
改成:
templates/rango/index.html:
{% if user.is_authenticated %} <h1> ` user`.`username `,歡迎來到Rango!</h1> {% else %} <h1>歡迎來到Rango!</h1> {% endif %}
咱們來看檢查一下工做成果,在瀏覽器中輸入:http://127.0.0.1:8000/rango/,而後點擊「登陸」連接,輸入用戶名和密碼以後(用管理員帳號「admin」便可),你會看到下面這樣的頁面:
22.添加訪問限制有些內容,咱們只但願給已登陸的用戶看到。這在Django中如何實現呢?
咱們來簡單演示一下。
編輯rango/views.py,添加如下內容:
rango/views.py:
@login_required def restricted(request): return HttpResponse("你只有在登陸後才能看到這段文本!")
別忘了在文件頭部加入如下代碼:
from django.contrib.auth.decorators import login_required
這個「@login_required」叫作「裝飾器」,咱們能夠理解成一段內置的小程序,程序在執行「restricted」這段代碼前先執行」login_required「,檢查用戶有無登陸,只有在用戶已登陸的狀況下,纔會顯示」restricted「中的內容。
咱們一樣要給「restricted」加上URL映射。編輯rango/urls.py,改爲下面這樣:
rango/urls.py:
urlpatterns = patterns('', url(r'^$', views.index, name='index'), url(r'^about/$', views.about, name='about'), url(r'^category/(?P<category_name_slug>\w+)', views.category, name='category'), url(r'^add_category/$', views.add_category, name='add_category'), url(r'^category/(?P<category_name_slug>\w+)/add_page/$', views.add_page, name='add_page'),
url(r'^register/$', views.register, name='register'), url(r'^login/$', views.user_login, name='login'), url(r'^restricted/', views.restricted, name='restricted'), )
爲了讓」login_required「將未登陸的用戶引導到登陸頁面,咱們在設置文件(rangoproject/settings.py)中要加入這樣一句代碼:
rangoproject/settings.py:
LOGIN_URL = '/rango/login/
23.添加註銷模塊
既然有登陸,那天然要提供一個註銷模塊,才顯得更爲合理。
在Django中加入一個註銷模塊是件很是簡單的事情。編輯rango/views.py 文件,讓它變成下面這個樣子:
rango/views.py(注意將第一行放到文件頭部):
from django.contrib.auth import logout # 使用login_required()裝飾器來確保只有已登陸的用戶才能夠訪問這個視圖 @login_required def user_logout(request): # 咱們只能對已登陸的用戶使用註銷功能 logout(request) # 將用戶從新引導回首頁. return HttpResponseRedirect('/rango/')
加入URL映射。編輯rango/urls.py,改爲下面這樣:
rango/urls.py:
urlpatterns = patterns('', url(r'^$', views.index, name='index'), url(r'^about/$', views.about, name='about'), url(r'^category/(?P<category_name_slug>\w+)$', views.category, name='category'), url(r'^add_category/$', views.add_category, name='add_category'), url(r'^category/(?P<category_name_slug>\w+)/add_page/$', views.add_page, name='add_page'), url(r'^register/$', views.register, name='register'), url(r'^login/$', views.user_login, name='login'), url(r'^restricted/', views.restricted, name='restricted'), url(r'^logout/$', views.user_logout, name='logout'), )
咱們在模板中也要作相應的修改。只讓已登陸的用戶才能看到」註銷「連接。
修改首頁模板(templates/rango/index.html),把「註冊」和」登陸「的兩行代碼刪掉,加入以下內容:
templates/rango/index.html:
{% if user.is_authenticated %} <a href="/rango/restricted/">限制頁面</a><br /> <a href="/rango/logout/">註銷</a><br /> {% else %} <a href="/rango/register/">註冊</a><br /> <a href="/rango/login/">登陸</a><br /> {% endif %}
【未完待續】