django用户登录和注销的实现方法


Posted in Python onJuly 16, 2018

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+端口访问,出现登录界面

django用户登录和注销的实现方法

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

django用户登录和注销的实现方法

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

django用户登录和注销的实现方法

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

django用户登录和注销的实现方法

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

四、排错

1、'bootstrap_toolkit' is not a valid tag library

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

资源链接

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
举例讲解Python程序与系统shell交互的方式
Apr 09 Python
Python实现股市信息下载的方法
Jun 15 Python
Pycharm学习教程(3) 代码运行调试
May 03 Python
Python cookbook(数据结构与算法)同时对数据做转换和换算处理操作示例
Mar 23 Python
Python3实现的简单验证码识别功能示例
May 02 Python
Python用for循环实现九九乘法表
May 31 Python
python对list中的每个元素进行某种操作的方法
Jun 29 Python
django2.0扩展用户字段示例
Feb 13 Python
基于python框架Scrapy爬取自己的博客内容过程详解
Aug 05 Python
python3连接MySQL8.0的两种方式
Feb 17 Python
使用py-spy解决scrapy卡死的问题方法
Sep 29 Python
Python日志模块logging用法
Jun 05 Python
Flask框架实现给视图函数增加装饰器操作示例
Jul 16 #Python
flask框架使用orm连接数据库的方法示例
Jul 16 #Python
flask框架实现连接sqlite3数据库的方法分析
Jul 16 #Python
Sanic框架异常处理与中间件操作实例分析
Jul 16 #Python
对pycharm代码整体左移和右移缩进快捷键的介绍
Jul 16 #Python
对Python3.6 IDLE常用快捷键介绍
Jul 16 #Python
Sanic框架请求与响应实例分析
Jul 16 #Python
You might like
php面象对象数据库操作类实例
2014/12/02 PHP
Laravel框架实现发送短信验证功能代码
2016/06/06 PHP
PHP封装的XML简单操作类完整实例
2017/11/13 PHP
PHP实现单条sql执行多个数据的insert语句方法
2019/10/11 PHP
php实现将数组或对象写入到文件的方法小结【三种方法】
2020/04/22 PHP
雄兵连第三季海报曝光,艾妮熙德成主角,蔷薇新造型
2021/03/09 国漫
JS中简单的实现像C#中using功能(有源码下载)
2007/01/09 Javascript
Jquery 过滤器(first,last,not,even,odd)的使用
2014/01/22 Javascript
详解基于Angular4+ server render(服务端渲染)开发教程
2017/08/28 Javascript
vue router demo详解
2017/10/13 Javascript
vue 标签属性数据绑定和拼接的实现方法
2018/05/17 Javascript
详解使用 Node.js 开发简单的脚手架工具
2018/06/08 Javascript
JS实现字符串翻转的方法分析
2018/08/31 Javascript
JS闭包经典实例详解
2018/12/20 Javascript
vue页面加载时的进度条功能(实例代码)
2020/01/13 Javascript
[38:23]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第一场
2014/05/24 DOTA
[01:14]英雄,所敬略同——2018完美盛典宣传视频4K
2018/12/05 DOTA
python33 urllib2使用方法细节讲解
2013/12/03 Python
python中私有函数调用方法解密
2016/04/29 Python
python操作列表的函数使用代码详解
2017/12/28 Python
对pandas将dataframe中某列按照条件赋值的实例讲解
2018/11/29 Python
Python修改文件往指定行插入内容的实例
2019/01/30 Python
Python获取基金网站网页内容、使用BeautifulSoup库分析html操作示例
2019/06/04 Python
python3.6+selenium实现操作Frame中的页面元素
2019/07/16 Python
如何使用Python多线程测试并发漏洞
2019/12/18 Python
python tkinter实现连连看游戏
2020/11/16 Python
浅析几个CSS3常用功能的写法
2014/06/05 HTML / CSS
英国家庭家具、照明和花园家具购物网站:Furniture123
2018/12/31 全球购物
网站域名和主机:Domain.com
2019/04/01 全球购物
SheIn沙特阿拉伯:女装在线
2020/03/23 全球购物
英国领先的独立酒精饮料零售商:DrinkSupermarket
2021/01/13 全球购物
酒店led欢迎词
2014/01/09 职场文书
平安家庭示范户事迹
2014/06/02 职场文书
公司员工安全协议书
2014/11/21 职场文书
整改通知书格式
2015/04/22 职场文书
Java服务调用RestTemplate与HttpClient的使用详解
2022/06/21 Java/Android