1、drf需要djnago版本在2.2,python版本在3.5上
卸载django包:
pip uninstall django
安装django
pip install django==2.2.10
# 国外网络慢,换国内源安装
pip install django=2.2.10 https://pypi.douban.com/simple
2、安装DRF
# 在项目的terminal中,安装
pip install djangorestframework
# 国外网络慢,可以换成国内的源
pip install djangorestframework -i https://pypi.douban.com/simple
3、安装成功以后,要进行注册(跟应用的注册一样),这个是三方包
进入到项目的配置文件中:
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework',#注册drf ]
4、安装django的jwt
安装:pip install djangorestframework-jwt https://pypi.douban.com/simple
1、settings.py注册到app中
INSTALLED_APPS = [
...
'rest_framework_jwt',
...
]
在配置文件中写入:配置过期时间
#2、配置
import datetime
JWT_AUTH = {
'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7),
'JWT_AUTH_HEADER_PREFIX': 'JWT', #前缀需要家jwt
}
在应用内,创建auth.py,里面写认证类的解析过程:
前端携带token过来,进行认证,自己写认证:auth.py
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from rest_framework_jwt.serializers import jwt_decode_handler,jwt_get_username_from_payload
import jwt
class MyJWTAuthentication(BaseAuthentication):
#重写authenticate方法
def authenticate(self, request):
#前端是将token通过http请求头发送过来,且AUTHORIZATION:token
token = request.META.get('HTTP_AUTHORIZATION')
if token:
#jwt通过了通过三段tokken,取出payload的方法,并且有校验功能
try:
payload = jwt_decode_handler(token)
username = payload.get('username')
return (username,token)#返回值必须是元组
#通过认证的视图,可以通过request.user 拿到这里return的元组的第一个元素,
#request.auth 拿到的return的元组的第二个元素
except jwt.ExpiredSignature:
msg = 'token过期'
raise AuthenticationFailed(msg)
except jwt.DecodeError:
msg='toke非法'
raise AuthenticationFailed(msg)
except jwt.InvalidTokenError:
msg = '用户非法'
raise AuthenticationFailed(msg)
except Exception as e:
msg=str(e)
raise AuthenticationFailed(msg)
raise AuthenticationFailed('你没有携带认证信息,请携带token')
在登陆视图生成token返回给浏览器保存:
from rest_framework.viewsets import ViewSet
#获取token
class UserView(ViewSet):
#datail=True的时候,查询字符串携带pk
@action(methods=['POST'],detail=False)
def login(self,request,*args,**kwargs):
username = request.data.get('username')
password = request.data.get('password')
user = models.User.objects.filter(username=username).first()
ret = user.check_password(password)
if ret:
token = self._get_token(user)
return ReSponse(data={'token':token,'username':username},status=200)
else:
return ReSponse(status=400,data={'error':'用户名或密码错误'})
def _get_token(self,user):
from rest_framework_jwt.serializers import jwt_payload_handler, jwt_encode_handler
#传递用户对象,获取token
payload = jwt_payload_handler(user)
token = jwt_encode_handler(payload)
return token
认证类的全局使用和局部使用:
3、全局配置:在settings.py下
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
#这个是我们自己写的认证类所在的位置,到类名就可以
'studentSystemt.apps.user.authen.MyJWTAuthentication'
],
}
局部配置:
在视图类中添加:
class Home():
authentication_classes = [authen.MyJWTAuthentication]配置全局使用:
1、在视图中authentication_classes = [] 实现局部禁用
5、在django中解决跨域问题
安装:
pip install django-cors-headers https://pypi.douban.com/simple
在配置文件中书写
INSTALLED_APPS = [
......
'corsheaders',
]
......
MIDDLEWARE = [
......
'corsheaders.middleware.CorsMiddleware',
]
# 添加跨域增加忽略
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_ALLOW_ALL = True
# 添加白名单
CORS_ORIGIN_WHITELIST = (
'http://127.0.0.1:8080',
'http://localhost:8080', # 凡是出现在白名单中的域名,都可以访问后端接口
)
# 添加跨域请求允许的请求方式
CORS_ALLOW_METHODS = (
'DELETE',
'GET',
'OPTIONS',
'PATCH',
'POST',
'PUT',
'VIEW',
)
# 添加跨域请求允许的请求头类型
CORS_ALLOW_HEADERS = (
'XMLHttpRequest',
'X_FILENAME',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
'Pragma',
)