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中统计函数运行耗时的方法
May 05 Python
Python字符编码判断方法分析
Jul 01 Python
Python实现中一次读取多个值的方法
Apr 22 Python
PyCharm设置SSH远程调试的方法
Jul 17 Python
用Python实现读写锁的示例代码
Nov 05 Python
Python3实现的简单三级菜单功能示例
Mar 12 Python
Python3使用Matplotlib 绘制精美的数学函数图形
Apr 11 Python
pandas 如何分割字符的实现方法
Jul 29 Python
Python3 元组tuple入门基础
Feb 09 Python
tensorflow的ckpt及pb模型持久化方式及转化详解
Feb 12 Python
python连接mongodb集群方法详解
Feb 13 Python
python 服务器运行代码报错ModuleNotFoundError的解决办法
Sep 16 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创建PDF中文文档
2006/10/09 PHP
如何利用PHP执行.SQL文件
2013/07/05 PHP
PHP开发框架kohana中处理ajax请求的例子
2014/07/14 PHP
PHP编程开发怎么提高编程效率 提高PHP编程技术
2015/11/09 PHP
Yii多表联合查询操作详解
2016/06/02 PHP
php使用escapeshellarg时中文被过滤的解决方法
2016/07/10 PHP
PHP页面输出搜索后跳转下一页的处理方法
2016/09/30 PHP
php 常用的系统函数
2017/02/07 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
pjblog中的UBBCode.js
2007/04/25 Javascript
原生js 秒表实现代码
2012/07/24 Javascript
js onkeypress与onkeydown 事件区别详细说明
2012/12/13 Javascript
杨氏矩阵查找的JS代码
2013/03/21 Javascript
JS操作select下拉框动态变动(创建/删除/获取)
2013/06/02 Javascript
jQuery 顶部导航跟随滚动条滚动固定浮动在顶部
2014/06/06 Javascript
Jquery树插件zTree用法入门教程
2015/02/17 Javascript
JavaScript将一个数组插入到另一个数组的方法
2015/03/19 Javascript
jQuery Ajax页面局部加载方法汇总
2016/06/02 Javascript
JS HTML5实现拖拽移动列表效果
2020/08/27 Javascript
原生JS实现几个常用DOM操作API实例
2017/01/19 Javascript
JavaScript创建对象的七种方式(推荐)
2017/06/26 Javascript
说说Vue.js中的functional函数化组件的使用
2019/02/12 Javascript
element-ui 远程搜索组件el-select在项目中组件化的实现代码
2019/12/04 Javascript
原生JS实现顶部导航栏显示按钮+搜索框功能
2019/12/25 Javascript
Python subprocess模块学习总结
2014/03/13 Python
Python实现简单字典树的方法
2016/04/29 Python
Python实现针对中文排序的方法
2017/05/09 Python
Python Dataframe常见索引方式详解
2020/05/27 Python
Python如何使用正则表达式爬取京东商品信息
2020/06/01 Python
高中毕业自我鉴定
2013/12/22 职场文书
优秀公益广告词大全
2014/03/19 职场文书
优秀教师自我评价范文
2014/09/27 职场文书
运动会致辞稿
2015/07/29 职场文书
Golang 切片(Slice)实现增删改查
2022/04/22 Golang
MySQL 自动填充 create_time 和 update_time
2022/05/20 MySQL
VUE递归树形实现多级列表
2022/07/15 Vue.js