django rest framework 实现用户登录认证详解


Posted in Python onJuly 29, 2019

1、安装

pip install djangorestframework

django rest framework 实现用户登录认证详解

2、创建项目及应用

目录结构如图

django rest framework 实现用户登录认证详解

3、设置settings.py

设置数据库连接

# MySQL 增加mysql 连接
DATABASES = {
 'default':{
  'ENGINE':'django.db.backends.mysql',
  'HOST':'127.0.0.1',
  'PORT':'3306',
  'NAME':'dbname', # 数据库名
  'USER':'username',
  'PASSWORD':'password',
  'OPTIONS':{
   'sql_mode': 'traditional'
  },
 }
}

添加应用

# Application definition
INSTALLED_APPS = [
  ...
 'rest_framework',
 'api',
]

4、创建用户信息models,在models.py

from django.db import models
# Create your models here.
class User(models.Model):
 username = models.CharField(max_length=32,unique=True)
 password = models.CharField(max_length=32)
 class Meta:
  db_table = 'user'
  verbose_name = verbose_name_plural = '用户信息表'
class userToken(models.Model):
 username = models.OneToOneField(to='User',on_delete=models.DO_NOTHING)
 token = models.CharField(max_length=60)
 class Meta:
  db_table = 'user_token'
  verbose_name = verbose_name_plural = '用户token表'

在项目下执行命令生成数据表

python manage.py makemigrations 
python manage.py migrate

5、在views.py 文件里,编写登录验证程序

from django.shortcuts import render
# Create your views here.
import time
from api import models
from django.http import JsonResponse
from rest_framework.views import APIView
class AuthView(APIView):
 def post(self,request,*args,**kwargs):
  ret = {'code':1000,'msg':None}
  try:
   # 参数是datadict 形式
   usr = request.data.get('username')
   pas = request.data.get('password')
   # usr = request._request.POST.get('username')
   # pas = request._request.POST.get('password')
   # usr = request.POST.get('username')
   # pas = request.POST.get('password')
   print(usr)
   # obj = models.User.objects.filter(username='yang', password='123456').first()
   obj = models.User.objects.filter(username=usr,password=pas).first()
   print(obj)
   print(type(obj))
   print(obj.username)
   print(obj.password)
   if not obj:
    ret['code'] = '1001'
    ret['msg'] = '用户名或者密码错误'
    return JsonResponse(ret)
    # 里为了简单,应该是进行加密,再加上其他参数
   token = str(time.time()) + usr
   print(token)
   models.userToken.objects.update_or_create(username=obj, defaults={'token': token})
   ret['msg'] = '登录成功'
   #ret['token'] = token
  except Exception as e:
   ret['code'] = 1002
   ret['msg'] = '请求异常'
  return JsonResponse(ret)

6、在urls.py设置访问路径

from django.contrib import admin
from django.urls import path
from django.conf.urls import url
from api.views import AuthView
urlpatterns = [
 path('admin/', admin.site.urls),
 url(r'^api/v1/auth/$', AuthView.as_view()),
]

7、通过postman验证登录接口

django rest framework 实现用户登录认证详解

django rest framework 实现用户登录认证详解

如图显示登录成功。

遇到的坑:

views获取Post参数的方式:

# 如下有三种方式获取参数,有些文章介绍,必须使用第二种,
# 其实不然,具体使用哪种要看参数的传入形式而定,建议使用第一种,
#因为第一种支持key-value 和 json 格式 ,后面两种仅支持 key-value.
usr = request.data.get('username')
pas = request.data.get('password')
# usr = request._request.POST.get('username')
# pas = request._request.POST.get('password')
# usr = request.POST.get('username')
# pas = request.POST.get('password')

postman 配置

1、如图,如果没有选择设置content-type,则参数要选择 form-data,上面获取参数的方式 三种皆可。

django rest framework 实现用户登录认证详解

2、如果选择了content-type为application/json,则body 要选择raw ,如图

django rest framework 实现用户登录认证详解

而此时获取参数的方式只能选择第一种。

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

Python 相关文章推荐
python3图片转换二进制存入mysql
Dec 06 Python
浅谈Python数据类型之间的转换
Jun 08 Python
python爬取拉勾网职位数据的方法
Jan 24 Python
Python下载网络小说实例代码
Feb 03 Python
详解python实现线程安全的单例模式
Mar 05 Python
python实现简单淘宝秒杀功能
May 03 Python
flask中过滤器的使用详解
Aug 01 Python
Python对列表的操作知识点详解
Aug 20 Python
使用PyTorch将文件夹下的图片分为训练集和验证集实例
Jan 08 Python
解决jupyter运行pyqt代码内核重启的问题
Apr 16 Python
Django DRF认证组件流程实现原理详解
Aug 17 Python
Python爬虫之用Xpath获取关键标签实现自动评论盖楼抽奖(二)
Jun 07 Python
pycharm重命名文件的方法步骤
Jul 29 #Python
PyQt5实现暗黑风格的计时器
Jul 29 #Python
Python Django 实现简单注册功能过程详解
Jul 29 #Python
Django models.py应用实现过程详解
Jul 29 #Python
pycharm中显示CSS提示的知识点总结
Jul 29 #Python
pandas 如何分割字符的实现方法
Jul 29 #Python
python自定义时钟类、定时任务类
Feb 22 #Python
You might like
php中对2个数组相加的函数
2011/06/24 PHP
PHP通过session id 实现session共享和登录验证的代码
2012/06/03 PHP
thinkPHP使用pclzip打包备份mysql数据库的方法
2016/04/30 PHP
PHP实现的多文件上传类及用法示例
2016/05/06 PHP
PHP strcmp()和strcasecmp()的区别实例
2016/11/05 PHP
PHP实现删除多重数组对象属性并重新赋值的方法
2017/06/07 PHP
url 编码 js url传参中文乱码解决方案
2010/04/11 Javascript
jQuery的控件及事件(输入控件及回车事件)使用示例
2013/07/25 Javascript
实现动画效果核心方式的js代码
2013/09/27 Javascript
Event altKey,ctrlKey,shiftKey属性解析
2013/12/18 Javascript
file控件选择上传文件确定后触发的js事件是哪个
2014/03/17 Javascript
探讨js字符串数组拼接的性能问题
2014/10/11 Javascript
JS实现点击复选框将按钮或文本框变为灰色不可用的方法
2015/08/11 Javascript
jQuery 实现ajax传入参数含有特殊字符的方法总结
2016/10/17 Javascript
理解javascript中的闭包
2017/01/11 Javascript
Vue数据驱动模拟实现5
2017/01/13 Javascript
浅谈Node Inspector 代理实现
2017/10/19 Javascript
Vue中的slot使用插槽分发内容的方法
2018/03/01 Javascript
详解Vue CLI3配置解析之css.extract
2018/09/14 Javascript
JS实现星星海特效
2019/12/24 Javascript
Python 读写文件和file对象的方法(推荐)
2016/09/12 Python
Python实现基于TCP UDP协议的IPv4 IPv6模式客户端和服务端功能示例
2018/03/22 Python
Python 实现日志同时输出到屏幕和文件
2020/02/19 Python
python GUI库图形界面开发之PyQt5多线程中信号与槽的详细使用方法与实例
2020/03/08 Python
Python批量处理csv并保存过程解析
2020/05/16 Python
Python WebSocket长连接心跳与短连接的示例
2020/11/24 Python
详解pandas映射与数据转换
2021/01/22 Python
软件测试企业面试试卷
2016/07/13 面试题
中西医专业毕业生职业规划书
2014/02/24 职场文书
十佳护士先进事迹
2014/05/08 职场文书
安全资料员岗位职责范本
2014/06/28 职场文书
学生安全责任书模板
2014/07/25 职场文书
工伤事故处理协议书怎么写
2014/10/15 职场文书
房屋产权证明书
2015/06/19 职场文书
晶体管来复再生式二管收音机
2021/04/22 无线电
MyBatis在注解上使用动态SQL方式(@select使用if)
2022/07/07 Java/Android