Django REST Framework JWT 用户的登录注册
安装配配置
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 用户的登录注册的更多相关文章
- Django REST Framework JWT提供的登录签发的视图
Django REST Framework JWT提供了一个视图.在我们登录的时候,会校验用户名.密码是否正确.如果信息无误,可以返回一个JWT token.就可以简单地实现了记录用户登录状态. 用法 ...
- 6 Django REST framework JWT 和登录功能实现
JWT 在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证. 我们不再使用Session认证机制,而使用Json Web Token认证机制. Json web token ( ...
- Django REST framework JWT学习
1.JWT学习 在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证.我们不再使用Session认证机制,而使用Json Web Token认证机制. Json web toke ...
- 利用Django中间件middleware解决用户未登录问题(转)
add by zhj: Django的中间件一般用于处理通用性的问题,分为五种,按处理顺序为request_middleware,view_middleware,exception_middlewar ...
- Django rest framework集成微博第三方登录
Django restframework 集成第三方登录(微博.微信.QQ等) 友情链接 python-social-auth-app官方文档 微博开放者平台 QQ开放者平台 准备工作 1.注册微博开 ...
- 微信小程序登录对接Django后端实现JWT方式验证登录
先上效果图 点击授权按钮后可以显示部分资料和头像,点击修改资料可以修改部分资料. 流程 1.使用微信小程序登录和获取用户信息Api接口 2.把Api获取的用户资料和code发送给django后端 3. ...
- Django Rest Framework之用户频率/访问次数限制
内置接口代码基本结构 settings.py: REST_FRAMEWORK = { 'DEFAULT_THROTTLE_CLASSES':['api.utils.mythrottle.UserThr ...
- django drf 自定义jwt用户验证逻辑
新建Backend类 from django.contrib.auth.backends import ModelBackend from django.shortcuts import render ...
- JWT验证机制【刘新宇】【Django REST framework中使用JWT】
JWT 在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证.我们不再使用Session认证机制,而使用Json Web Token认证机制. 什么是JWT Json web t ...
随机推荐
- 一文搞懂后台高性能服务器设计的常见套路, BAT 高频面试系列
微信搜索「编程指北」,关注这个写干货的程序员,回复「资源」,即可获取后台开发学习路线和书籍 先赞后看,养成习惯~ 前言 金九银十,又是一年校招季. 经历过,才深知不易.最近,和作为校招面试官的同事聊了 ...
- day83:luffy:添加购物车&导航栏购物车数字显示&购物车页面展示
目录 1.添加购物车+验证登录状态 2.右上方购物车图标的小红圆圈数字 3.Vuex 4.购物车页面展示-后端接口 5.购物车页面展示-前端 6.解决一个购物车数量显示混乱的bug 1.添加购物车+验 ...
- 一个 Task 不够,又来一个 ValueTask ,真的学懵了!
一:背景 1. 讲故事 前几天在项目中用 MemoryStream 的时候意外发现 ReadAsync 方法多了一个返回 ValueTask 的重载,真是日了狗了,一个 Task 已经够学了,又来一个 ...
- nginx下配置php5和php7
用的是lnmp 一键安装的 php5.6版本网上百度Ubuntu安装多版本PHP就行 参考文章原链接:http://blog.csdn.net/21aspnet/article/details/476 ...
- c#中简单工厂模式
运算类 public class yunsuan { public static operation create(string operate) { operation oper = null; s ...
- 利用sklearn实现k-means
基于上面的一篇博客k-means利用sklearn实现k-means #!/usr/bin/env python # coding: utf-8 # In[1]: import numpy as np ...
- 嗖嗖移动大厅 源代码 Java初级小项目
今天给大家一个比较综合的项目:嗖嗖移动业务大厅.项目功能很多,概括的功能也很全面.吃透了这个项目,你的java基础部分已经非常棒了!!! 一 . 项目概述 技能要求 使用面向对象设计的思想 合 ...
- c# ToolStrip控件图片和文字显示--原创
如上图达到这样的效果 首先我们给属性Image和Text分别赋予需要显示的图片和文字 然后设置DisplyStyle属性为ImageAndText,意为同时显示图片和文字 各种设置ImageAlign ...
- 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 ...
- intelx86为何从0xFFFF0处执行
第一条指令的地址 在用户按下计算机电源开关之后,CPU会自动的将其CS寄存器设定为0xFFFF,将其IP寄存器设定为0x0000.由于CS:IP指出了下一条指令的地址[1],因此CPU会跳到0xFFF ...