• [Django实战] 第4篇


    今天来实现用户登录模块

    首先,我们创建一个表单(forms.py):

    from django import forms
    from django.contrib.auth.models import User
    from bootstrap_toolkit.widgets import BootstrapDateInput, BootstrapTextInput, BootstrapUneditableInput
    
    class LoginForm(forms.Form):
        username = forms.CharField(
            required=True,
            label=u"用户名",
            error_messages={'required': '请输入用户名'},
            widget=forms.TextInput(
                attrs={
                    'placeholder':u"用户名",
                }
            ),
        )
        
        password = forms.CharField(
            required=True,
            label=u"密码",
            error_messages={'required': u'请输入密码'},
            widget=forms.PasswordInput(
                attrs={
                    'placeholder':u"密码",
                }
            ),
        )
        
        def clean(self):
            if not self.is_valid():
                raise forms.ValidationError(u"用户名和密码为必填项")
            else:
                cleaned_data = super(LoginForm, self).clean() 

    该表单有两个域username和password,这两个域都为必填项。

    接着,我们定义login的视图(view.py):

    from django.shortcuts import render_to_response,render,get_object_or_404  
    from django.http import HttpResponse, HttpResponseRedirect  
    from django.contrib.auth.models import User  
    from django.contrib import auth
    from django.contrib import messages
    from django.template.context import RequestContext
    
    from django.forms.formsets import formset_factory
    from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
    
    from bootstrap_toolkit.widgets import BootstrapUneditableInput
    from django.contrib.auth.decorators import login_required
    
    from .forms import LoginForm
    
    def login(request):
        if request.method == 'GET':
            form = LoginForm()
            return render_to_response('login.html', RequestContext(request, {'form': form,}))
        else:
            form = LoginForm(request.POST)
            if form.is_valid():
                username = request.POST.get('username', '')
                password = request.POST.get('password', '')
                user = auth.authenticate(username=username, password=password)
                if user is not None and user.is_active:
                    auth.login(request, user)
                    return render_to_response('index.html', RequestContext(request))
                else:
                    return render_to_response('login.html', RequestContext(request, {'form': form,'password_is_wrong':True}))
            else:
                return render_to_response('login.html', RequestContext(request, {'form': form,}))

    该视图实例化了之前定义的LoginForm,它的主要业务逻辑是:

    1. 判断必填项用户名和密码是否为空,如果为空,提示"用户名和密码为必填项”的错误信息

    2. 判断用户名和密码是否正确,如果错误,提示“用户名或密码错误"的错误信息

    3. 登陆成功后,进入主页

    login.html定义如下:

    <!DOCTYPE html>
    {% load bootstrap_toolkit %}
    {% load url from future %}
    <html lang="en">
    <head>
        <meta charset="utf-8">
        <title>数据库脚本发布系统</title>
        <meta name="description" content="">
        <meta name="author" content="朱显杰">
        {% bootstrap_stylesheet_tag %}
        {% bootstrap_stylesheet_tag "responsive" %}
        <style type="text/css">
            body {
                padding-top: 60px;
            }
        </style>
        <!--[if lt IE 9]>
        <script src="//html5shim.googlecode.com/svn/trunk/html5.js"></script>
        <![endif]-->
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
        {% bootstrap_javascript_tag %}
        {% block extra_head %}{% endblock %}
    </head>
    
    <body>
    
        {% if password_is_wrong %}
            <div class="alert alert-error">
                <button type="button" class="close" data-dismiss="alert">×</button>
                <h4>错误!</h4>用户名或密码错误
            </div>
        {% endif %}    
        <div class="well">
            <h1>数据库脚本发布系统</h1>
            <p> </p>
            <form class="form-horizontal" action="" method="post">
                {% csrf_token %}
                {{ form|as_bootstrap:"horizontal" }}
                <p class="form-actions">
                    <input type="submit" value="登录" class="btn btn-primary">
                    <a href="/contactme/"><input type="button" value="忘记密码" class="btn btn-danger"></a>
                    <a href="/contactme/"><input type="button" value="新员工?" class="btn btn-success"></a>
                </p>
            </form>
        </div>
    
    </body>
    </html>

    最后还需要在urls.py里添加:

        (r'^accounts/login/$',  'dbrelease_app.views.login'),


    最终的效果如下:

    1)当在浏览器里输入http://192.168.1.16:8000/accounts/login/,出现如下登陆界面:


    2)当用户名或密码为空时,提示”用户名和密码为必填项",如下所示:


    3)当用户名或密码错误时,提示“用户名或密码错误",如下所示:


    4)如果用户名和密码都正确,进入主页。


    有login,自然会有logout,logout的视图定义如下:

    @login_required
    def logout(request):
        auth.logout(request)
        return HttpResponseRedirect("/accounts/login/")

    urls.py里添加:

    (r'^accounts/logout/$', 'dbrelease_app.views.logout'),



  • 相关阅读:
    Python中的垃圾回收机制
    一个很好的复习网站
    数据结构与算法 python语言描述
    数据结构与算法学习链接
    [转] 什么是WSGI
    【转】HTTP协议详解
    【转】Android HTTP协议
    Android获取本机IP地址
    Andrid 多线程下载
    Android 应用程序启动过程源代码分析
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3310675.html
Copyright © 2020-2023  润新知