zoukankan      html  css  js  c++  java
  • 实战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 %}

    【未完待续】

    本文版权归舍得学苑所有,欢迎转载,转载请注明作者和出处。谢谢!
    作者:舍得
    首发:舍得学苑@博客园

     
  • 相关阅读:
    艾伟:[WCF中的Binding模型]之六(完结篇):从绑定元素认识系统预定义绑定 狼人:
    艾伟:.NET框架4.0中都有些什么? 狼人:
    艾伟:WM有约(三):下一次是什么时候? 狼人:
    艾伟:为什么微软要推 ADO.NET Data Services Framework 狼人:
    艾伟:WM有约(二):配置信息 狼人:
    艾伟:F4何去何从 大视野观察Framework 4.0 狼人:
    艾伟:[WCF的Binding模型]之三:信道监听器(Channel Listener) 狼人:
    艾伟:.NET : 如何保护内存中的敏感数据? 狼人:
    艾伟:Silverlight 2.0 之旋转木马 狼人:
    艾伟:.NET和J2EE该相互学习什么 狼人:
  • 原文地址:https://www.cnblogs.com/emagic/p/4503708.html
Copyright © 2011-2022 走看看