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 相关文章推荐
Python提示[Errno 32]Broken pipe导致线程crash错误解决方法
Nov 19 Python
python对数组进行反转的方法
May 20 Python
python实现的DES加密算法和3DES加密算法实例
Jun 03 Python
python使用xslt提取网页数据的方法
Feb 23 Python
用Python将一个列表分割成小列表的实例讲解
Jul 02 Python
Flask和Django框架中自定义模型类的表名、父类相关问题分析
Jul 19 Python
python散点图实例之随机漫步
Aug 27 Python
python 子类调用父类的构造函数实例
Mar 12 Python
python上传时包含boundary时的解决方法
Apr 08 Python
如何更换python默认编辑器的背景色
Aug 10 Python
详解Django自定义图片和文件上传路径(upload_to)的2种方式
Dec 01 Python
django中cookiecutter的使用教程
Dec 03 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网页游戏学习之Xnova(ogame)源码解读(八)
2014/06/23 PHP
Zend Framework教程之Zend_Db_Table_Row用法实例分析
2016/03/21 PHP
PHP 实现文件压缩解压操作的方法
2019/06/14 PHP
windows系统php环境安装swoole具体步骤
2021/03/04 PHP
JavaScript Event学习第十一章 按键的检测
2010/02/10 Javascript
javascript 原型继承介绍
2011/08/30 Javascript
浅析js中的浮点型运算问题
2014/01/06 Javascript
JavaScript函数获取事件源的小例子
2014/05/14 Javascript
jQuery中get和post方法传值测试及注意事项
2014/08/08 Javascript
Angular.JS学习之依赖注入$injector详析
2016/10/20 Javascript
AngularJS动态菜单操作指令
2017/04/25 Javascript
实现div内部滚动条滚动到底部和顶部的代码
2017/11/15 Javascript
浅谈MUI框架中加载外部网页或服务器数据的方法
2018/01/31 Javascript
使用Vue动态生成form表单的实例代码
2018/04/26 Javascript
JavaScript设计模式之观察者模式实例详解
2019/01/16 Javascript
在vue中把含有html标签转为html渲染页面的实例
2019/10/28 Javascript
Vue中常用rules校验规则(实例代码)
2019/11/14 Javascript
node使用request请求的方法
2019/12/20 Javascript
Python编程对列表中字典元素进行排序的方法详解
2017/05/26 Python
Python字典,函数,全局变量代码解析
2017/12/18 Python
python实现redis三种cas事务操作
2017/12/19 Python
解决python删除文件的权限错误问题
2018/04/24 Python
Python Pandas数据结构简单介绍
2019/07/03 Python
python GUI库图形界面开发之PyQt5单行文本框控件QLineEdit详细使用方法与实例
2020/02/27 Python
解决python Jupyter不能导入外部包问题
2020/04/15 Python
pygame用blit()实现动画效果的示例代码
2020/05/28 Python
Flask处理Web表单的实现方法
2021/01/31 Python
西班牙伏林航空公司:Vueling
2016/08/05 全球购物
GafasWorld哥伦比亚:网上购买眼镜
2017/11/28 全球购物
Yahoo-PHP面试题1
2016/07/20 面试题
Java Servlet API中forward() 与redirect()的区别
2014/04/20 面试题
超市总经理岗位职责
2014/02/02 职场文书
初中班主任评语
2014/04/24 职场文书
企业金融服务方案
2014/06/03 职场文书
酒桌上的开场白
2015/06/01 职场文书
Golang 字符串的常见操作
2022/04/19 Golang