• django用户登录和注销


    django版本:1.4.21。

    一、准备工作

    1、新建项目和app

    [root@yl-web-test srv]# django-admin.py startproject lxysite
    [root@yl-web-test srv]# cd lxysite/
    [root@yl-web-test lxysite]# python manage.py startapp accounts
    [root@yl-web-test lxysite]# ls
    accounts  lxysite  manage.py

    2、配置app

    在项目settings.py中的

    INSTALLED_APPS = ( 
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.sites',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        # Uncomment the next line to enable the admin:
        # 'django.contrib.admin',
        # Uncomment the next line to enable admin documentation:
        # 'django.contrib.admindocs',
        'accounts',
    )

    3、配置url

    在项目urls.py中配置

    urlpatterns = patterns('',
        # Examples:
        # url(r'^$', 'lxysite.views.home', name='home'),
        # url(r'^lxysite/', include('lxysite.foo.urls')),
    
        # Uncomment the admin/doc line below to enable admin documentation:
        # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
    
        # Uncomment the next line to enable the admin:
        # url(r'^admin/', include(admin.site.urls)),
        url(r'^accounts/', include('accounts.urls')),
    )

    4、配置templates

    新建templates目录来存放模板,

    [root@yl-web-test lxysite]# mkdir templates
    [root@yl-web-test lxysite]# ls
    accounts  lxysite  manage.py  templates

    然后在settings中配置

    TEMPLATE_DIRS = ( 
        # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
        # Always use forward slashes, even on Windows.
        # Don't forget to use absolute paths, not relative paths.
        '/srv/lxysite/templates',
    )

    5、配置数据库

    我用的是mysql数据库,先创建数据库lxysite

    mysql> create database lxysite;
    Query OK, 1 row affected (0.00 sec)

    然后在settings.py中配置

    DATABASES = { 
        'default': {
            'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
            'NAME': 'lxysite',                      # Or path to database file if using sqlite3.
            'USER': 'root',                      # Not used with sqlite3.
            'PASSWORD': 'password',                  # Not used with sqlite3.
            'HOST': '10.1.101.35',                      # Set to empty string for localhost. Not used with sqlite3.
            'PORT': '3306',                      # Set to empty string for default. Not used with sqlite3.
        }   
    }

    然后同步数据库:同步过程创建了一个管理员账号:liuxiaoyan,password,后面就用这个账号登录和注销登录。

    [root@yl-web-test lxysite]# python manage.py syncdb
    Creating tables ...
    Creating table auth_permission
    Creating table auth_group_permissions
    Creating table auth_group
    Creating table auth_user_user_permissions
    Creating table auth_user_groups
    Creating table auth_user
    Creating table django_content_type
    Creating table django_session
    Creating table django_site
    
    You just installed Django's auth system, which means you don't have any superusers defined.
    Would you like to create one now? (yes/no): yes
    Username (leave blank to use 'root'): liuxiaoyan
    E-mail address: liuxiaoyan@test.com
    Password: 
    Password (again): 
    Superuser created successfully.
    Installing custom SQL ...
    Installing indexes ...
    Installed 0 object(s) from 0 fixture(s)

    至此,准备工作完成。

    二、实现登录功能

    使用django自带的用户认证,实现用户登录和注销。

    1、定义一个用户登录表单(forms.py)

    因为用的了bootstrap框架,执行命令#pip install django-bootstrap-toolkit安装。

    并在settings.py文件中配置

    INSTALLED_APPS = ( 
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.sites',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        # Uncomment the next line to enable the admin:
        # 'django.contrib.admin',
        # Uncomment the next line to enable admin documentation:
        # 'django.contrib.admindocs',
        'bootstrap_toolkit',
        'accounts',
    )

    forms.py没有强制规定,建议放在和app的views.py同一目录。

    #coding=utf-8
    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,这两个域都为必填项。

    2、定义登录视图views.py

    在视图里实例化上一步定义的用户登录表单

    # Create your views here.
    
    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、登录成功后,进入主页(index.html)

    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>

    配置accounts的urls.py

    from django.conf.urls import *
    from accounts.views import login,logout
    
     
    urlpatterns = patterns('',
                                     url(r'login/$',login),
                                                             )   

    4、首页(index.html)

    代码如下:

    <!DOCTYPE html>
    {% load bootstrap_toolkit %}
    
    <html lang="en">
    {% bootstrap_stylesheet_tag %}
    {% bootstrap_stylesheet_tag "responsive" %}
    
    <h1>登录成功</h1>
    <a href="/accounts/logout/"><input type="button" value="登出" class="btn btn-success"></a>
    
    </html>

    配置登出的url

    from django.conf.urls import *
    from accounts.views import login,logout
    
     
    urlpatterns = patterns('',
                                     url(r'login/$',login),
                                     url(r'logout/$',logout),
                                                             )   

    登录视图如下:调用djagno自带用户认证系统的logout,然后返回登录界面。

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

    上面@login_required标示只有登录用户才能调用该视图,否则自动重定向到登录页面。

     三、登录注销演示

    1、执行python manage.py runserver 0.0.0.0:8000

    在浏览器输入ip+端口访问,出现登录界面

    2、当用户名或密码为空时,提示“用户名和密码为必填项”

    3、当用户名或密码错误时,提示“用户名或密码错误”

    4、输入正确用户名和密码(创建数据库时生成的liuxiaoyan,password),进入主页

    5、点击登出,注销登录,返回登录页面。

    四、排错

    1、'bootstrap_toolkit' is not a valid tag library

    因为你的INSTALLED_APP没有安装'bootstrap_toolkit',安装即可。

    资源链接

    http://blog.csdn.net/dbanote/article/details/11465447

    http://my.oschina.net/u/569730/blog/369144

    本文作者starof,因知识本身在变化,作者也在不断学习成长,文章内容也不定时更新,为避免误导读者,方便追根溯源,请诸位转载注明出处:http://www.cnblogs.com/starof/p/4724381.html有问题欢迎与我讨论,共同进步。

  • 相关阅读:
    OSX安装nginx和rtmp模块(rtmp直播服务器搭建)
    用runtime来重写Coder和deCode方法 归档解档的时候使用
    Homebrew安装卸载
    Cannot create a new pixel buffer adaptor with an asset writer input that has already started writing'
    OSX下面用ffmpeg抓取桌面以及摄像头推流进行直播
    让nginx支持HLS
    iOS 字典转json字符串
    iOS 七牛多张图片上传
    iOS9UICollectionView自定义布局modifying attributes returned by UICollectionViewFlowLayout without copying them
    Xcode6 iOS7模拟器和Xcode7 iOS8模拟器离线下载
  • 原文地址:https://www.cnblogs.com/starof/p/4724381.html
Copyright © 2020-2023  润新知