一 导入auth模块

from django.contrib.auth.models import User
from django.contrib import auth

auth模块的操作针对的就是auth_user表

二 auth模块的方法

  1 authenticate() 用户验证函数。验证成功,返回一个名称为用户登录名的User对象,这个对象可以调用auth_user表中的属性。验证失败,返回None。

def login(request):
if request.method=='POST':
username=request.POST.get('username')
password=request.POST.get('password')
user=auth.authenticate(username=username,password=password)
print(user,type(user))
return render(request,'login.html')
return render(request,'login.html')

  输出:

zuo <class 'django.contrib.auth.models.User'>

  2 login(request,user) 记录session功能

 user=auth.authenticate(username=username,password=password)
if user:
auth.login(request,user)
return redirect('/index/')

  3 logout(request) 注销

  核心 代码 request.session.flush()

 auth.logout(request)

  PS  request.user。获取当前登录的用户,返回值是一个对象。 用在index页面。确定当前是否有用户登录。如果不是匿名,说明login登录成功。如果是匿名,说明login登录不成功,跳转login页面。

  一个AUTH_USER_MODEL 类型的对象,表示当前登录的用户。如果用户当前没有登录,user 将设置为django.contrib.auth.models.AnonymousUser 的一个实例。你可以通过is_authenticated() 区分它们。

  user 只有当Django 启用AuthenticationMiddleware 中间件时才可用。

  没有用户时:

def index(request):

    username=request.user
print(username,type(username))

  输出:

AnonymousUser <class 'django.utils.functional.SimpleLazyObject'>

  有用户时:

  输出

zuo <class 'django.utils.functional.SimpleLazyObject'>

三 User对象的API

  1 is_authenticated() 返回布尔值,判断用户是否登录

  2 创建新用户

    User.objects.create_user(username='',password='')

  3 修改密码

    user=User.objects.get(username='xx')

    user.set_password('新密码')      user是对象

    user.save()

四 form表单提交文件

  预备知识:

  request.FILES

    一个类似于字典的对象,包含所有的上传文件。FILES 中的每个键为<input type="file" name="" /> 中的name

    注意,FILES 只有在请求的方法为POST 且提交的<form> 带有enctype="multipart/form-data" 的情况下才会包含数据。否则,FILES 将为一个空的类似于字典的对象。

    示例:正确的情况

<MultiValueDict: {'one': [<InMemoryUploadedFile: 新建文本文档.txt (text/plain)>]}>

    [<InMemoryUploadedFile: 新建文本文档.txt (text/plain)>] 可以通过file_obj=requset.FILES.get('one')取到,是一个文件句柄。文件名可以通过file_obj.name取到

  前端核心代码

  注意更改 enctype 参数 !!

<form action="/upload/" method="post" enctype="multipart/form-data">
{% csrf_token %}
<p>用户: <input type="text" name='username'></p>
<p><input type="file" name="one"></p>
<p><input type="submit" value="提交"></p>
</form>

  后端核心代码

def upload(request):
if request.method=='POST':
print(request.POST)
print(request.FILES)
file_obj=request.FILES.get('one')
print(file_obj,type(file_obj)) #查看句柄,及其类型。句柄名和句柄.name一样。
name=file_obj.name
import os
from ORM_BOOK import settings
path=os.path.join(settings.BASE_DIR,'app01','file',name)
with open(path,'wb') as f:
for line in file_obj: #从文件句柄中,保存的是二进制数据。因为发过来的就是二进制呀
f.write(line)
return HttpResponse('ok')
return render(request,'upload.html')

  输出:

<QueryDict: {'csrfmiddlewaretoken': ['HFay06QNV4w9UsUWpJ8i7Te9f8fUEljNieaG7UlF2V5KYvT7COxaMPjVFsAXV6si'], 'username': ['']}>
<MultiValueDict: {'one': [<InMemoryUploadedFile: 新建文本文档.txt (text/plain)>]}>
新建文本文档.txt <class 'django.core.files.uploadedfile.InMemoryUploadedFile'>

五 ajax 上传数据

  预备知识:

  1 FormData:

    原文博客地址:http://www.cnblogs.com/rubylouvre/archive/2011/04/26/2028827.html

    FF4中增加了一个很有意思的对象,FormData。通常我们提交(使用submit button)时,会把form中的所有表格元素的name与value组成一个queryString,提交到后台。这用jQuery的方法来说,就是serialize。但当我们使用Ajax提交时,这过程就要变成人工的了。因此,FormData对象的出现可以减少我们一些工作量。

    FormData对象添加数据用append('key','value')方法。 key 是input的name值,value是input的框的内容。 value的数据类型可以是字符串,也可以是二进制数据,并没有限定。

var $formdata=new FormData();
console.log($formdata,typeof $formdata);
$formdata.append('username',$("[name='username']").val());
$formdata.append('one',$("[name='one']")[0].files[0]);

  输出:

FormData "object"

  2 用jQuery从<input type='file'></input>取到上传的文件内容。

$("[name='one']")[0].files[0]
$("[name='one']") jQuery对象
$("[name='one']")[0] jQuery对象转为DOM对象
$("[name='one']")[0].files DOM对象的方法
$("[name='one']")[0].files[0] 取索引值为0,便会取到上传的文件内容。

  3 processData  预处理

    类型:Boolean

    默认值: true。默认情况下,通过data选项传递进来的数据,如果是一个对象(技术上讲只要不是字符串),都会处理转化成一个查询字符串,以配合默认内容类型 "application/x-www-form-urlencoded"。如果要发送 DOM 树信息或其它不希望转换的信息,请设置为 false。

  4 contentType

  

  前端核心代码,基于ajax,逻辑写在前端

  注意FormData,$formdata.append(), data:$formdata,  $('')[0].files[0],  processData:false

<body>
{#<form action="/upload/" method="post" enctype="multipart/form-data">#}
{# {% csrf_token %}#}
{# <p>用户: <input type="text" name='username'></p>#}
{# <p><input type="file" name="one"></p>#}
{# <p><input type="submit" value="提交"></p>#}
{#</form>#}
<p>用户: <input type="text" name='username'></p>
<p><input type="file" name="one"></p>
<p><input type="button" value="提交"></p>
<script src="/static/jquery-3.2.1.min.js"></script>
<script src="/static/jquery.cookie.js"></script>
<script src="/static/bootstrap/js/bootstrap.min.js"></script>
<script>
$(':button').click(function () {
var $formdata=new FormData();
console.log($formdata,typeof $formdata);
$formdata.append('username',$("[name='username']").val());
$formdata.append('one',$("[name='one']")[0].files[0]);
$.ajax({
url:'/ajax_upload/',
type:'post',
data:$formdata,
processData:false,
contentType:false,
headers:{"X-CSRFToken":$.cookie('csrftoken')}, //第二种发送csrf的方法,用js操作浏览器的cookies
success:function (data) {
console.log(data)
}
})
})
</script>
</body>

  后端代码

  基本不用变

def ajax_upload(request):
if request.is_ajax():
print(request.POST)
print(request.FILES)
file_obj = request.FILES.get('one')
print(file_obj, type(file_obj))
name = file_obj.name
import os
from ORM_BOOK import settings
path = os.path.join(settings.BASE_DIR, 'app01', 'file', name)
with open(path, 'wb') as f:
for line in file_obj:
f.write(line)
return HttpResponse('ok')
return render(request,'upload.html')

  输出:

<QueryDict: {'username': ['']}>
[13/Dec/2017 21:15:12] "POST /ajax_upload/ HTTP/1.1" 200 2
<MultiValueDict: {'one': [<InMemoryUploadedFile: 新建文本文档.txt (text/plain)>]}>
新建文本文档.txt <class 'django.core.files.uploadedfile.InMemoryUploadedFile'>

六 自定义auth.user模型

  django自带的user表并不能够满足要求,有时候需要添加age,salary,telephone等字段,怎么办呢?

  完全新建一个独立的表是不行的,我们还需要用django自带的方法。

  有两种思路

  1 新建一个userdetail表,和auth.user表建立一对一的关系

  适用场景:

    很适用于创建第三方扩充包的场景,松耦合,不会破坏之前项目的结构.在自己的django prj下,希望有多重user拥有各自很不相同的字段.或许希望有些用户组合起来一些用户的类型字段,并且希望能在模型层面上解决这些问题.

  2 继承auth.user。推荐这种方式。PS:(模型层,一个模型对应数据库中的一个表。)

  如何实现思路2?

from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):

  然后,在settings.py里面添加

  AUTH_USER_MODEL='yourappname.UserInfo(就是你自己写的那个类名)'

    

用户认证系统 django.contrib.auth模块的更多相关文章

  1. Django 认证系统 cookie & session & auth模块

    概念 cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生. cookie的工作原理是:由服务器产生内容,浏 ...

  2. Django Authentication 用户认证系统

    一. Django的认证系统 Django自带一个用户认证系统,用于处理用户账户.群组.许可和基于cookie的用户会话. 1.1 概览 Django的认证系统包含了身份验证和权限管理两部分.简单地说 ...

  3. Django之auth模块用户认证模块

    一.Auth模块 1)auth模块是什么.登录后台使用的账号密码,则就是使用的auth模块创建的表 Auth模块是Django自带的用户认证模块: 我们在开发一个网站的时候,无可避免的需要设计实现网站 ...

  4. Django之auth模块(用户认证)

    auth模块简介 auth模块是对登录认证方法的一种封装,之前我们获取用户输入的用户名及密码后需要自己从user表里查询有没有用户名和密码符合的对象, 而有了auth模块之后就可以很轻松的去验证用户的 ...

  5. Django之auth模块(用户认证)登陆组件

    auth模块简介 auth模块是对登录认证方法的一种封装,之前我们获取用户输入的用户名及密码后需要自己从user表里查询有没有用户名和密码符合的对象, 而有了auth模块之后就可以很轻松的去验证用户的 ...

  6. django用户认证系统——登录4

    用户已经能够在我们的网站注册了,注册就是为了登录,接下来我们为用户提供登录功能.和注册不同的是,Django 已经为我们写好了登录功能的全部代码,我们不必像之前处理注册流程那样费劲了.只需几分钟的简单 ...

  7. django用户认证系统——基本设置1

    网站提供登录.注册等用户认证功能是一个常见的需求.因此,Django 提供了一套功能完整的.灵活的.易于拓展的用户认证系统:django.contrib.auth.在本教程中,我将向你展示 auth ...

  8. django使用auth模块进行身份认证

    https://docs.djangoproject.com/zh-hans/2.0/topics/auth/default/#authentication-in-web-requests djang ...

  9. D django 用户认证系统

    django认证系统包含三个部分:用户.权限和分组 安装 django项目默认启用了认证系统,如果不是使用django-admin.py创建项目的可以通过在settings配置文件里面的INSTALL ...

随机推荐

  1. java基础—基础语法2

    一.语句

  2. C#数组删除元素

    一.C#数组删除元素 在C#中,只能在动态数组ArrayList类中对数组执行删除元素的操作.因为动态数组是一个可以改变数组长度和元素个数的数据类型. 示例: using System;using S ...

  3. 小试牛刀,建立jsp网页与导出war包

    一.建立jsp网页 首先创建一个动态项目(我们学习的是动态网) 二.检查编码utf-8有没错误. 如有错误就是没有设置eclipse,请按照eclipse设置 编写一段代码,进行了解 三.导出一个wa ...

  4. Linux下手动备份还原硬盘主引导记录MBR跟硬盘分区表DPT教程

    Linux下手动备份还原硬盘主引导记录MBR跟硬盘分区表DPT教程 二 18 奶牛 Linux, Ubuntu, Windows 1,885 views查看评论 最近奶牛一直在折腾linux下的gru ...

  5. numpy的linspace使用详解

    文档地址: https://docs.scipy.org/doc/numpy/reference/generated/numpy.linspace.html Parameters(参数): start ...

  6. Linux下打包解压命令

    tar 压缩: tar -cvjpf etc.tar.bz2 /etc //-c为创建一个打包文件,相应的-f后面接创建的文件的名称,使用了.tar.bz2后缀,-j标志使用bzip2压缩,最后面为具 ...

  7. LNMP的环境搭建

    新装的Linux 机器,还没有来得及安装网站环境,这篇文章就是记录一下自己安装LNMP的一般步骤. 之前在Laravel视频中看过这段的讲解,后来也试着安装过,基本的命令不算是熟练掌握,所以还要看看之 ...

  8. Leetcode5078. 负二进制数相加

    问题: 5078. 负二进制数相加 给出基数为 -2 的两个数 arr1 和 arr2,返回两数相加的结果. 数字以 数组形式 给出:数组由若干 0 和 1 组成,按最高有效位到最低有效位的顺序排列. ...

  9. MySQL查询时,查询结果如何按照where in数组排序

    MySQL查询时,查询结果如何按照where in数组排序 在查询中,MySQL默认是order by id asc排序的,但有时候需要按照where in 的数组顺序排序,比如where in的id ...

  10. 重写laravel 异常抛出处理

    所有异常错误都由类App\Exceptions\Handler处理,该类包含两个方法:report和render. 这里我们只看render方法,该方法会将异常渲染到HTTP响应中,就是说上面的错误信 ...