一、简介
- 本篇文章主要介绍如何创建一个纯净版本的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,
}
配置完成后即可成功访问