django用户登录和注销

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介:

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有问题欢迎与我讨论,共同进步。


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
前端开发 JavaScript 数据库
Django+Vue开发生鲜电商平台之7.用户登录和注册功能(下)
基于DRF的前后端分离登录与单独使用Django登录的原理不同,不再需要CSRF验证,DRF提供了许多开箱即用的身份验证方案,并且还允许实现自定义方案。
Django+Vue开发生鲜电商平台之7.用户登录和注册功能(下)
|
前端开发 JavaScript 数据库
Django+Vue开发生鲜电商平台之7.用户登录和注册功能(中)
基于DRF的前后端分离登录与单独使用Django登录的原理不同,不再需要CSRF验证,DRF提供了许多开箱即用的身份验证方案,并且还允许实现自定义方案。
Django+Vue开发生鲜电商平台之7.用户登录和注册功能(中)
|
存储 JSON 算法
Django+Vue开发生鲜电商平台之7.用户登录和注册功能(上)
基于DRF的前后端分离登录与单独使用Django登录的原理不同,不再需要CSRF验证,DRF提供了许多开箱即用的身份验证方案,并且还允许实现自定义方案。
Django+Vue开发生鲜电商平台之7.用户登录和注册功能(上)
|
存储 安全 前端开发
Django API 开发:实现用户登录与注册(下)
现在,我们需要更新身份验证系统以使用令牌。 第一步是更新我们的 DEFAULT_AUTHENTICATION_CLASSES 设置以使用 TokenAuthentication
|
API 数据库 数据安全/隐私保护
Django API 开发:实现用户登录与注册(中)
现在,我们需要更新身份验证系统以使用令牌。 第一步是更新我们的 DEFAULT_AUTHENTICATION_CLASSES 设置以使用 TokenAuthentication
Django API 开发:实现用户登录与注册(中)
|
API 数据库 网络架构
Django API 开发:实现用户登录与注册(上)
现在,我们需要更新身份验证系统以使用令牌。 第一步是更新我们的 DEFAULT_AUTHENTICATION_CLASSES 设置以使用 TokenAuthentication
|
前端开发 Python
Django入门笔记:第十三章、用户登录
Django入门笔记:第十三章、用户登录
|
Web App开发 关系型数据库 数据库
Django 搭建CMDB系统完整[1](用户登录)
***使用的mysql数据库,所以系统中要先安装mysql数据库 1、安装环境: pip install django python -m pip install --upgrade pip setuptools python -m pip insta...
2695 0
|
数据安全/隐私保护
第12章节-Python3.5-Django实现用户登录 11
Django实现用户登录 修改urls.py 文件: from django.conf.urls import url from django.contrib import admin from cmdb import views urlpatterns = [ url(r'^admin/', admin.
1083 0
|
数据安全/隐私保护 Python
第13章节-Python3.5-Django实现用户登录2 12
让很多app都共享的静态文件, 创建一个static目录专门放静态文件: image.png 把jquery.min.js复制到static目录下再创建 commons.
1065 0