Django Rest Framework - 实例PartyDemo 之 Token验证

1.配置

mysite/setting.py 配置token module

INSTALLED_APPS = (
    ...
    'rest_framework.authtoken'
)

2.生成相关表

python manage.py migrate
mysql> show tables;
+----------------------------+
| Tables_in_store            |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| authtoken_token  #生成此表

3.使用

在model中实现

testrestapi/model.py

(1).第一种,配置所有

# 为每个用户添加token值
@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_auth_token(sender, instance=None, created=False, **kwargs):
    if created:
        Token.objects.create(user=instance)

(2)第二种 sender指定实体

#from django.contrib.auth.models import User

@receiver(post_save, sender=User)
def create_auth_token(sender, instance=None, created=False, **kwargs):
    if created:
        Token.objects.create(user=instance)

当在views.py中进行 create_auth_token 的时候 当前view中的api就有token验证

#from django.conf import settings
#from django.db.models.signals import post_save
#from django.dispatch import receiver
#from rest_framework.authtoken.models import Token

def create_auth_token(sender, instance=None, created=False, **kwargs):
    if created:
        Token.objects.create(user=instance)

推荐第一种方案

访问是就会需要token 值

{
  "detail": "Authentication credentials were not provided."
}

4. token rest framework 配置实现

mysite/setting.py 配置

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated', #必须有
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
    )
} 

5.获取Token

(1)配置token url
在api moduel 下url.py 进行下面配置 :


urlpatterns = [
    url(r'^list/', PartyList.as_view()),
    url(r'^listset/', party_set_list),
    url(r'^detail/(?P<pk>[0-9]+)$', PartyDetail.as_view()),
    url(r'^api-token-auth/', views.obtain_auth_token), # 获取token 
]

(2)访问地址 : ip:port/modelname/api-token-auth

(3)返回值

这里写图片描述


6.验证

在http 请求header 添加 Authorization 字段,比如

Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b

比如postman , 注意 : Token 字段与值 之间有空格。

这里写图片描述


7.android 使用okhttp 拦截器实现

OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.addInterceptor(loggingInterceptor);
        builder.addNetworkInterceptor(new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request request = chain.request();
                if (SPUtil.hasKey(SPConstrant.USER_TOKEN)) {
                    //header add token
                    request = request.newBuilder()
                            .addHeader("Authorization","Token "+SPUtil.getSpString(SPConstrant.USER_TOKEN)) //伪获取
                            .build();
                }
                return chain.proceed(request);
            }
        });

8.问题

出现下面问题:

{
  "non_field_errors": [
    "Unable to log in with provided credentials."
  ]
}

解决:
1.auth_user表中是否有该用户;
2.该用户的is_active是否为1;
3.authtoken_token表中是否有该用户的记录;
4.先创建超级用户,再进行创建用户

  python manage.py createsuperuser

5.设置用户密码,可能是数据库存储的密码为明文
Django Rest Framework - 实例PartyDemo 之 用户相关


9.项目地址

https://github.com/LABELNET/django-mysite-frist

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Django REST Framework Cache是一个Django框架的扩展,用于缓存REST API的响应数据。它提供了一种简单的方式来缓存API视图的响应,以减少数据库查询和加快请求的响应速度。 使用Django REST Framework Cache,你可以通过在视图类或视图函数上添加装饰器来启用缓存。这个扩展支持多种缓存后端,包括内存缓存、数据库缓存和文件缓存等。你可以根据你的需求选择适合的缓存后端。 为了使用Django REST Framework Cache,你需要在你的Django项目中安装并配置它。你可以通过pip安装它: ``` pip install djangorestframework-cache ``` 安装完成后,在你的项目的settings.py文件中添加以下配置: ```python INSTALLED_APPS = [ ... 'rest_framework_cache', ] CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': '127.0.0.1:11211', } } REST_FRAMEWORK_CACHE = { 'DEFAULT_CACHE_BACKEND': 'default', } ``` 然后,在你的API视图类或函数上使用`@cache_response`装饰器来启用缓存: ```python from rest_framework.decorators import api_view from rest_framework_cache.decorators import cache_response @api_view(['GET']) @cache_response(timeout=60*60*24) # 缓存一天 def my_view(request): ... ``` 这样,当该API被访问时,响应数据将会被缓存,并在下次请求相同的API时直接返回缓存的响应数据,而不需要执行相同的查询操作。 通过使用Django REST Framework Cache,你可以有效地提高REST API的性能和响应速度,并减少对数据库的负载。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值