DRF学习——drf纯净版创建

一、简介

  • 本篇文章主要介绍如何创建一个纯净版本的DRF项目,并从源码方面分析django框架下的匿名用户

二、步骤

  • 新建项目,这里选择纯Python项目,而非Django项目,并且选择虚拟环境
    在这里插入图片描述

  • 此时可以得到一个纯净的python项目,之后需要在终端安装django以及djangorestframework第三方库

    pip install django==3.2   # 看自身需求是否指定版本
    pip install djangorestframework
    
  • 创建django项目,命令如下,可以得到一个day13目录

    django-admin startproject day13 .     # 项目名称可随意
    

    在这里插入图片描述

  • 进入settings.py注册drf,api,注释掉不需要的app,中间件等

    在这里插入图片描述

    • INSTALLED_APPS

      INSTALLED_APPS = [
          # 'django.contrib.admin',
          # 'django.contrib.auth',
          # 'django.contrib.contenttypes',
          # 'django.contrib.sessions',
          # 'django.contrib.messages',
          'django.contrib.staticfiles',
          'rest_framework',
      	'api.apps.ApiConfig',
      ]
      
    • MIDDLEWARE

      MIDDLEWARE = [
          'django.middleware.security.SecurityMiddleware',
          # 'django.contrib.sessions.middleware.SessionMiddleware',
          'django.middleware.common.CommonMiddleware',
          'django.middleware.csrf.CsrfViewMiddleware',
          # 'django.contrib.auth.middleware.AuthenticationMiddleware',
          # 'django.contrib.messages.middleware.MessageMiddleware',
          'django.middleware.clickjacking.XFrameOptionsMiddleware',
      ]
      
    • TEMPLATES

      TEMPLATES = [
          {
              'BACKEND': 'django.template.backends.django.DjangoTemplates',
              'DIRS': [],
              'APP_DIRS': True,
              'OPTIONS': {
                  'context_processors': [
                      'django.template.context_processors.debug',
                      'django.template.context_processors.request',
                      # 'django.contrib.auth.context_processors.auth',
                      # 'django.contrib.messages.context_processors.messages',
                  ],
              },
          },
      ]
      
  • 创建app,命令如下,可以得到api目录

    python manage.py startapp api
    

    在这里插入图片描述

  • 注册app,进入settings.py文件

    • INSTALLED_APPS

      INSTALLED_APPS = [
          # 'django.contrib.admin',
          # 'django.contrib.auth',
          # 'django.contrib.contenttypes',
          # 'django.contrib.sessions',
          # 'django.contrib.messages',
          'django.contrib.staticfiles',
          'rest_framework',
          'api.apps.ApiConfig',
      ]
      

三、测试API

  • 完成第二步之后,纯净版本的DRF项目已经创建完成,接下来写一个接口测试一下

  • urls.py

    from django.urls import path
    from api import views
    
    urlpatterns = [
        # path('admin/', admin.site.urls),
        path('user/', views.UserView.as_view()),
    ]
    
  • views.py

    from rest_framework.views import APIView
    from rest_framework.response import Response
    
    
    class UserView(APIView):
        def get(self,request):
            return Response("成功")
    
  • 运行drf项目,访问api接口

    http://127.0.0.1:8000/user/
    
  • 此时却收到报错

    具体报错信息如下:

    Model class django.contrib.contenttypes.models.ContentType doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.
    

    简单来讲就是说ContentType没有注册在app里,产生这个的原因是因为在第二步的时候在INSTALLED_APPS里将’django.contrib.contenttypes’注释掉了

四、分析原因

  • 在drf项目中存在一个匿名用户的东西,当我们访问url时,其携带的request会存储request.user和request.auth,其中request.user就是当前访问的用户,但是对于我们这个初创建的项目还没有做用户的功能,匿名用户也因此产生

  • 查看rest_framework.request的Request类

    在这里插入图片描述

  • 找到user,点击_authenticate

    在这里插入图片描述

  • 当没有用户认证时,便会走到_not_authenticated方法

    在这里插入图片描述

    if api_settings.UNAUTHENTICATED_USER:
    	self.user = api_settings.UNAUTHENTICATED_USER()
    else:
        self.user = None
    

    这段代码就是导致报错的原因,这里调用了django自带app的认证,但是由于那些app被我们注释掉了,因此导致了报错

  • 解决方法

    上方代码调用的是api_settings中的UNAUTHENTICATED_USER,而api_settings的定义如下

在这里插入图片描述

​ 因此只需要去settings.py文件中增加UNAUTHENTICATED_USER的定义即可

REST_FRAMEWORK={
    'UNAUTHENTICATED_USER': None,
}

配置完成后即可成功访问

[外链图片转存中...(img-vmjdt9jT-1687316469863)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hemameba

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值