安装配配置

pip install djangorestframework-jwt

配置setting

########### 1、在INSTALLED_APPS中加入'rest_framework.authtoken', #################
INSTALLED_APPS = [
'''
'rest_framework.authtoken', #
'''
] ################### 2、配置jwt验证 ######################
REST_FRAMEWORK = {
# 身份认证
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
),
#全局配置JWT验证设置
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
} import datetime
JWT_AUTH = {
'JWT_AUTH_HEADER_PREFIX': 'JWT',
'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
'JWT_RESPONSE_PAYLOAD_HANDLER':
'user.views.Login_return', # 重新login登录返回函数
}

settings.py

配置全局路由

"""syl URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/2.2/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path,include urlpatterns = [
path('admin/', admin.site.urls),
path('user/', include('user.urls')),
]

urls.py

配置局部路由

# -*- coding: utf-8 -*-
from django.urls import include, path
from rest_framework.authtoken.views import obtain_auth_token
from user import views
from user.views import *
from rest_framework_jwt.views import obtain_jwt_token urlpatterns = [
path('jwtuser/',UserView.as_view()),
path('login/',obtain_jwt_token),
path('user/',UserInfoView.as_view()), ]

user/urls.py

在model中添加

from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
from utils.MyBaseModel import Base class Vip(Base):
vip_choise = (
('0', '普通用户'),
('1', '普通会员'),
('2', '高级会员')
)
title = models.CharField('vip名称', max_length=16)
vip_type = models.CharField('Vip种类', choices=vip_choise, max_length=4)
desc = models.CharField('vip描述', max_length=255)
period = models.IntegerField('有效期', default=365)
class Meta:
db_table='tb_vip' def __str__(self):
return self.title
class User(AbstractUser):
phone = models.CharField('手机号', max_length=20)
img = models.ImageField(upload_to='user', null=True)
nick_name = models.CharField('昵称', max_length=20)
address = models.CharField('地址', max_length=255)
vip = models.ForeignKey(Vip, on_delete=models.SET_NULL, default=None, null=True)
vip_expration = models.DateTimeField('VIP到期时间',blank=True,default=None,null=True)
class Meta:
db_table = 'tb_user'

models.py

在serializers中添加

# -*- coding: utf-8 -*-
from django.contrib.auth.hashers import make_password
from rest_framework import serializers
from user.models import *
from utils.MyBaseVIew import create_token
class CreateUserSer(serializers.Serializer):
username=serializers.CharField()
password=serializers.CharField()
email=serializers.CharField()
phone=serializers.CharField()
token=serializers.CharField(read_only=True)
def create(self, validated_data):
user=User.objects.create(**validated_data)
password=make_password(validated_data.get("password"))
user.password=password
user.save()
token=create_token(user)
user.token=token
return user
class UserInfoSer(serializers.ModelSerializer):
class Meta:
model=User
fields=("username","id","phone","email")

user/serlizers.py

代码展示

from django.shortcuts import render
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework_jwt.authentication import JSONWebTokenAuthentication from user import serializers
from user import models
# Create your views here.
class UserView(APIView):
def post(self, request):
data = request.data
if not all(["username", "phone", "email", "password", "password2"]):
return Response({"code": 4003, 'msg': "参数不完整"}, status=200)
if data["password"] != data["password2"]:
return Response({"code": 4005, "msg": "两次密码不一致"}, status=200)
try:
user = serializers.CreateUserSer(data=data)
user.is_valid()
user.save()
res_data = {
"code": 0,
"msg": "创建成功",
"data": user.data
}
return Response(res_data)
except Exception as e:
res_data = {
"code": 4009,
"msg": "创建失败请重试"
}
return Response(res_data) def Login_return(token, user=None, request=None):
return {
'token': token,
'user': user.username,
'userid': user.id,
# "phone":user.phone
}
class UserInfoView(APIView):
permission_classes = [IsAuthenticated] # 接口中加权限
authentication_classes = [JSONWebTokenAuthentication]
def get(self,request):
user=models.User.objects.all()
ser=serializers.UserInfoSer(user,many=True)
res_data={
"code":0,
"msg":"请求成功",
"data":ser.data
}
return Response(res_data)

user/views

全局配置接口需要jwt验证

#jwt设置
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
),
#配置全部接口需要验证才能发访问,验证方式为登陆用户
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
}

settings.py

局部接口解除jwt验证要求

class RegisterView(APIView):
# 在此接口中允许所有用户访问,去除jwt的验证要求
permission_classes = [AllowAny] def post(self, request, *args, **kwargs):
serializer = UserSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=201)
return Response(serializer.errors, status=400)

user/views

自定义验证方式:要求手机或者邮箱也可作为登陆手段

AUTHENTICATION_BACKENDS=[
'user.views.PPAuth',
]

from django.db.models import Q
from django.contrib.auth.backends import ModelBackend def Login_return(token, user=None, request=None):
return {
'token': token,
'name':user.nick_name,
'username':user.username,
'authenticated':True,
'role':None,
'userid': user.id,
"phone":user.phone,
"email":user.email,
} class PPAuth(ModelBackend):
def authenticate(self,request,username=None,password=None,**kwargs):
user=models.User.objects.get(Q(username=username) | Q(email=username) | Q(phone=username))
if user is not None and user.check_password(password):
return user

user/views

Django REST Framework JWT 用户的登录注册的更多相关文章

  1. Django REST Framework JWT提供的登录签发的视图

    Django REST Framework JWT提供了一个视图.在我们登录的时候,会校验用户名.密码是否正确.如果信息无误,可以返回一个JWT token.就可以简单地实现了记录用户登录状态. 用法 ...

  2. 6 Django REST framework JWT 和登录功能实现

    JWT 在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证. 我们不再使用Session认证机制,而使用Json Web Token认证机制. Json web token ( ...

  3. Django REST framework JWT学习

    1.JWT学习 在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证.我们不再使用Session认证机制,而使用Json Web Token认证机制. Json web toke ...

  4. 利用Django中间件middleware解决用户未登录问题(转)

    add by zhj: Django的中间件一般用于处理通用性的问题,分为五种,按处理顺序为request_middleware,view_middleware,exception_middlewar ...

  5. Django rest framework集成微博第三方登录

    Django restframework 集成第三方登录(微博.微信.QQ等) 友情链接 python-social-auth-app官方文档 微博开放者平台 QQ开放者平台 准备工作 1.注册微博开 ...

  6. 微信小程序登录对接Django后端实现JWT方式验证登录

    先上效果图 点击授权按钮后可以显示部分资料和头像,点击修改资料可以修改部分资料. 流程 1.使用微信小程序登录和获取用户信息Api接口 2.把Api获取的用户资料和code发送给django后端 3. ...

  7. Django Rest Framework之用户频率/访问次数限制

    内置接口代码基本结构 settings.py: REST_FRAMEWORK = { 'DEFAULT_THROTTLE_CLASSES':['api.utils.mythrottle.UserThr ...

  8. django drf 自定义jwt用户验证逻辑

    新建Backend类 from django.contrib.auth.backends import ModelBackend from django.shortcuts import render ...

  9. JWT验证机制【刘新宇】【Django REST framework中使用JWT】

    JWT 在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证.我们不再使用Session认证机制,而使用Json Web Token认证机制. 什么是JWT Json web t ...

随机推荐

  1. 一文搞懂后台高性能服务器设计的常见套路, BAT 高频面试系列

    微信搜索「编程指北」,关注这个写干货的程序员,回复「资源」,即可获取后台开发学习路线和书籍 先赞后看,养成习惯~ 前言 金九银十,又是一年校招季. 经历过,才深知不易.最近,和作为校招面试官的同事聊了 ...

  2. day83:luffy:添加购物车&导航栏购物车数字显示&购物车页面展示

    目录 1.添加购物车+验证登录状态 2.右上方购物车图标的小红圆圈数字 3.Vuex 4.购物车页面展示-后端接口 5.购物车页面展示-前端 6.解决一个购物车数量显示混乱的bug 1.添加购物车+验 ...

  3. 一个 Task 不够,又来一个 ValueTask ,真的学懵了!

    一:背景 1. 讲故事 前几天在项目中用 MemoryStream 的时候意外发现 ReadAsync 方法多了一个返回 ValueTask 的重载,真是日了狗了,一个 Task 已经够学了,又来一个 ...

  4. nginx下配置php5和php7

    用的是lnmp 一键安装的 php5.6版本网上百度Ubuntu安装多版本PHP就行 参考文章原链接:http://blog.csdn.net/21aspnet/article/details/476 ...

  5. c#中简单工厂模式

    运算类 public class yunsuan { public static operation create(string operate) { operation oper = null; s ...

  6. 利用sklearn实现k-means

    基于上面的一篇博客k-means利用sklearn实现k-means #!/usr/bin/env python # coding: utf-8 # In[1]: import numpy as np ...

  7. 嗖嗖移动大厅 源代码 Java初级小项目

    今天给大家一个比较综合的项目:嗖嗖移动业务大厅.项目功能很多,概括的功能也很全面.吃透了这个项目,你的java基础部分已经非常棒了!!! 一 . 项目概述 技能要求  使用面向对象设计的思想  合 ...

  8. c# ToolStrip控件图片和文字显示--原创

    如上图达到这样的效果 首先我们给属性Image和Text分别赋予需要显示的图片和文字 然后设置DisplyStyle属性为ImageAndText,意为同时显示图片和文字 各种设置ImageAlign ...

  9. 378. Kth Smallest Element in a Sorted Matrix(大顶堆、小顶堆)

    Given a n x n matrix where each of the rows and columns are sorted in ascending order, find the kth ...

  10. intelx86为何从0xFFFF0处执行

    第一条指令的地址 在用户按下计算机电源开关之后,CPU会自动的将其CS寄存器设定为0xFFFF,将其IP寄存器设定为0x0000.由于CS:IP指出了下一条指令的地址[1],因此CPU会跳到0xFFF ...