django的DRF安装、认证类、跨域

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',
)

你可能感兴趣的:(django,django)