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 ...
随机推荐
- Java_垃圾回收机制(未掌握)
垃圾回收机制 任何一种垃圾回收算法一般要做两件基本事情: 发现无用的对象(没有任何变量引用该对象) 回收无用对象占用的内存空间 垃圾回收相关算法: 引用计数法, 引用可达法 分代垃圾回收机制: 不同的 ...
- R语言factor类型转numeric
R 语言中为了进行数据分析,比如回归分析,这时候对于数据表格中的factor类型的数据会带来弊端,比如对因子的每一个数据都进行一次回归,这样就显得很复杂,且违背了我们的初衷,需要把factor转换为n ...
- mongoDB之在windows下的安装
mongoDB官网http://www.mongodb.org/对mongoDB的描述: MongoDB (from "humongous") is an open-source ...
- 安装node.js和vue
1.在官网上下载Node.js安装包 https://nodejs.org/zh-cn/ 2.点击安装,一直下一步下一步就行,这里就不在赘述了. 3.安装完之后,如果没有选安装路径的话,一般都是在[ ...
- JSON小结【json-lib】
javabean:Address package com.baebae.model; public class Address { private String city; private Strin ...
- 基于CPU版本的Caffe推理框架
最近一段时间,认真研究了一下caffe.但是,里面内容过多,集合了CPU版本和GPU版本的代码,导致阅读起来有些复杂.因此,特意对caffe代码进行了重构,搭建一个基于CPU版本的Caffe推理框架. ...
- 创建一个自定义名称的Ceph集群
前言 这里有个条件,系统环境是Centos 7 ,Ceph 的版本为Jewel版本,因为这个组合下是由systemctl来进行服务控制的,所以需要做稍微的改动即可实现 准备工作 部署mon的时候需要修 ...
- linux下制作软件包安装服务器
linux下的软件包在有网络的情况下比较好安装,在ubuntu下,更新sourcelist,然后使用apt-get就可以很方便的安装包,在centos下面,更新yum列表,然后使用yum也可以进行方便 ...
- 最全Linux搭建SVN服务端教程
文章首推 支付宝接口对接 高德地图调用 验证码登录 QQ邮箱登录 今日主题:Linux搭建SVN服务端 简介 相信程序员对SVN还是不陌生的,虽然现在用Git比较多,但是SVN也是用的,SVN可以做代 ...
- Linux学习 - 02 使用 - Centos8 - 『更换rpm/epel包源为国内源』
1. Centos8 - 『更换rpm/epel包源为国内源』 centos 8 默认是会读取centos.org的mirrorlist的,所以一般来说是不需要配置镜像的. 如果你的网络访问mirro ...