在講完註冊模塊之後,我們來着手實現登錄和註銷模塊。
21.添加登錄模塊
註冊功能做好了,接下來我們來完成登錄模塊。
以下是我們要完成的工作:
- 創建一個登錄視圖;
- 創建登錄模板來顯示登錄表單;
- 將登錄視圖映射到URL;
- 在首頁上添加登錄鏈接;
我們先來搞定登錄視圖。
編輯rango/views.py,添加以下內容:
rango/views.py:
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', {})
最後,別忘了在文件頭部加入以下代碼:
from django.contrib.auth import authenticate, login from django.http import HttpResponseRedirect, HttpResponse
接下來創建登錄模板,創建templates/rango/login.html,加入如下內容:
templates/rango/login.html:
{% 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 %}
【未完待續】
本文版權歸捨得學苑所有,歡迎轉載,轉載請註明作者和出處。謝謝!
作者:捨得
首發:捨得學苑@博客園