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 当前全局变量和入口参数的所有属性
Jul 01 Python
Python修改Excel数据的实例代码
Nov 01 Python
Python编程入门之Hello World的三种实现方式
Nov 13 Python
Python实现简单的四则运算计算器
Nov 02 Python
Python设计模式之工厂模式简单示例
Jan 09 Python
Python使用pymysql从MySQL数据库中读出数据的方法
Jul 25 Python
Python对excel文档的操作方法详解
Dec 10 Python
python 实现创建文件夹和创建日志文件的方法
Jul 07 Python
python的json包位置及用法总结
Jun 21 Python
详解Python多线程下的list
Jul 03 Python
scrapy-redis分布式爬虫的搭建过程(理论篇)
Sep 29 Python
Python 类,对象,数据分类,函数参数传递详解
Sep 25 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简单对象与数组的转换函数代码(php多层数组和对象的转换)
2011/05/18 PHP
PHP中isset与array_key_exists的区别实例分析
2015/06/02 PHP
PHP代码实现爬虫记录――超管用
2015/07/31 PHP
一个简单至极的PHP缓存类代码
2015/10/23 PHP
浅谈php和js中json的编码和解码
2016/10/24 PHP
php使用preg_match()函数验证ip地址的方法
2017/01/07 PHP
php微信公众号开发之现金红包
2018/04/16 PHP
JavaScript 类似flash效果的立体图片浏览器
2010/02/08 Javascript
jquery load事件(callback/data)使用方法及注意事项
2013/02/06 Javascript
JQ获取动态加载的图片大小的正确方法分享
2013/11/08 Javascript
setTimeout()递归调用不加引号出错的解决方法
2014/09/05 Javascript
纯JS打造网页中checkbox和radio的美化效果
2016/10/13 Javascript
js实现适合新闻类图片的轮播效果
2017/02/05 Javascript
easyui-edatagrid.js实现回车键结束编辑功能的实例
2017/04/12 Javascript
vue编译打包本地查看index文件的方法
2018/02/23 Javascript
使用JSON格式提交数据到服务端的实例代码
2018/04/01 Javascript
jQuery基于Ajax实现读取XML数据功能示例
2018/05/31 jQuery
layui监听select变化,以及设置radio选中的方法
2019/09/24 Javascript
Angular+Ionic使用queryParams实现跳转页传值的方法
2020/09/05 Javascript
python实用代码片段收集贴
2015/06/03 Python
用十张图详解TensorFlow数据读取机制(附代码)
2018/02/06 Python
Linux-ubuntu16.04 Python3.5配置OpenCV3.2的方法
2018/04/02 Python
修改默认的pip版本为对应python2.7的方法
2018/11/06 Python
解决Pandas的DataFrame输出截断和省略的问题
2019/02/08 Python
django admin组件使用方法详解
2019/07/19 Python
基于python3 的百度图片下载器的实现代码
2019/11/05 Python
pandas实现导出数据的四种方式
2020/12/13 Python
阿迪达斯俄罗斯官方商城:adidas俄罗斯
2017/03/08 全球购物
智能旅行箱:Horizn Studios
2018/04/30 全球购物
迪卡侬印尼体育用品商店:Decathlon印尼
2020/03/11 全球购物
北京RT科技有限公司.net工程师面试题
2013/02/15 面试题
学历公证委托书
2014/04/09 职场文书
理想演讲稿范文
2014/05/21 职场文书
群众路线教育实践活动学习笔记内容
2014/11/06 职场文书
导游词开场白
2015/01/31 职场文书
圣诞晚会主持词
2015/07/01 职场文书