赞
踩
官方文档网站https://jpadilla.github.io/django-rest-framework-jwt/#usage
JWT官方网址有兴趣可以看一看
pip install djangorestframework-jwt
- REST_FRAMEWORK = {
- 'DEFAULT_AUTHENTICATION_CLASSES': (
- 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', #JWt认证
- 'rest_framework.authentication.SessionAuthentication', #基本认证
- 'rest_framework.authentication.BasicAuthentication', #session认证
- ),
- }
-
- JWT_AUTH = {
- 'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1), #设置登录有效期
- # 修改JWT的登录视图的构造函数
- 'JWT_RESPONSE_PAYLOAD_HANDLER': 'users.utils.jwt_response_payload_handler',
- }
-
- # 修改Django用户认证后端类
- AUTHENTICATION_BACKENDS = [
- 'users.utils.UsernameMobileAuthBackend',
- ]
不需要views实现功能,所以我们创建一个utils来实现登录功能
- ef get_user_by_account(account):
- """
- 根据帐号获取user对象
- :param account: 账号,可以是用户名,也可以是手机号
- :return: User对象 或者 None
- """
- try:
- if re.match('^1[3-9]\d{9}$', account):
- # 帐号为手机号
- user = User.objects.get(mobile=account)
- else:
- # 帐号为用户名
- user = User.objects.get(username=account)
- except User.DoesNotExist:
- return None
- else:
- return user
-
-
- class UsernameMobileAuthBackend(ModelBackend):
- """
- 自定义用户名或手机号认证
- """
-
- def authenticate(self, request, username=None, password=None, **kwargs):
- user = get_user_by_account(username)
- if user is not None and user.check_password(password):
- return user
在create函数中加入
- # 补充生成记录登录状态的token
- jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
- jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
- payload = jwt_payload_handler(user)
- token = jwt_encode_handler(payload)
- user.token = token
在序列化器中加入token,可以勾选记住登录。
token = serializers.CharField(label='token', read_only=True)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。