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中还原JavaScript的escape函数编码后字符串的方法
Aug 22 Python
Python生成随机密码
Mar 10 Python
Django中的“惰性翻译”方法的相关使用
Jul 27 Python
python如何实现excel数据添加到mongodb
Jul 30 Python
python中ASCII码和字符的转换方法
Jul 09 Python
Python实现随机创建电话号码的方法示例
Dec 07 Python
Python 文本文件内容批量抽取实例
Dec 10 Python
Pycharm 使用 Pipenv 新建的虚拟环境(图文详解)
Apr 16 Python
django 数据库返回queryset实现封装为字典
May 19 Python
浅谈Python中文件夹和python package包的区别
Jun 01 Python
安装pyinstaller遇到的各种问题(小结)
Nov 20 Python
Python爬虫+Tkinter制作一个翻译软件的示例
Feb 20 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_SELF的安全问题
2009/09/05 PHP
php 判断页面或图片是否经过gzip压缩的方法
2017/04/05 PHP
PHP操作MongoDB实现增删改查功能【附php7操作MongoDB方法】
2018/04/24 PHP
jquery 插件实现图片延迟加载效果代码
2010/02/06 Javascript
模拟jQuery中的ready方法及实现按需加载css,js实例代码
2013/09/27 Javascript
基于jQuery实现返回顶部实例代码
2016/01/01 Javascript
javascript和jquery实现用户登录验证
2016/05/04 Javascript
JS中dom0级事件和dom2级事件的区别介绍
2016/05/05 Javascript
ES6记录异步函数的执行时间详解
2016/08/31 Javascript
EasyUI折叠表格层次显示detailview详解及实例
2016/12/28 Javascript
基于Bootstrap漂亮简洁的CSS3价格表(附源码下载)
2017/02/28 Javascript
Vue.js实现按钮的动态绑定效果及实现代码
2017/08/21 Javascript
详解jQuery获取特殊属性的值以及设置内容
2018/11/14 jQuery
nodejs使用async模块同步执行的方法
2019/03/02 NodeJs
elementui之el-tebs浏览器卡死的问题和使用报错未注册问题
2019/07/06 Javascript
easyUI 实现的后台分页与前台显示功能示例
2020/06/01 Javascript
解决vue一个页面中复用同一个echarts组件的问题
2020/07/19 Javascript
详解JavaScript 事件流
2020/09/02 Javascript
JS页面动态绘图工具SVG,Canvas,VML介简介
2020/10/16 Javascript
python编程-将Python程序转化为可执行程序[整理]
2007/04/09 Python
python批量同步web服务器代码核心程序
2014/09/01 Python
python实现的jpg格式图片修复代码
2015/04/21 Python
5个很好的Python面试题问题答案及分析
2018/01/19 Python
浅谈Python在pycharm中的调试(debug)
2018/11/29 Python
python random从集合中随机选择元素的方法
2019/01/23 Python
Python中按键来获取指定的值
2019/03/02 Python
python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例
2020/02/25 Python
django 模型中的计算字段实例
2020/05/19 Python
Python监听剪切板实现方法代码实例
2020/11/11 Python
美国二手复古奢侈品包包购物网站:LXRandCo
2019/06/18 全球购物
商场拾金不昧表扬信
2014/01/13 职场文书
学生手册评语
2014/05/05 职场文书
2015年元旦联欢晚会活动总结
2014/11/28 职场文书
小学元宵节活动总结
2015/02/06 职场文书
祝酒词范文
2015/08/12 职场文书
2019通用版导游词范本!
2019/08/07 职场文书