實戰Django:Rango Part5

在講完註冊模塊之後,我們來着手實現登錄和註銷模塊。

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”即可),你會看到下面這樣的頁面:

4_thumb

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 %}

 

【未完待續】

本文版權歸捨得學苑所有,歡迎轉載,轉載請註明作者和出處。謝謝!
作者:捨得
首發:捨得學苑@博客園

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章