as报错:Exception raised during rendering: com/android/util/PropertiesMap (Details)

本文解决了因选择过高的预览API版本导致无法预览的问题。若使用API24出现预览异常,可通过选择API24以下版本实现正常预览。

错误如下:


原因:这是因为我们选择的预览api版本太高。我这里用的是api24,所以会显示不出来预览。




解决方法:选择api24以下的版本就能正常预览了。


<think> 根据用户的问题描述,访问`http://127.0.0.1:8000/docs/`时出现404错误,并且错误是由`django.contrib.admin.sites.catch_all_view`引发的。同时,用户提到之前的问题是关于Core API和OpenAPI的,因此我们推测`/docs/`路径可能是用于API文档的。 结合引用内容: 引用[1]提到当DEBUG=True时,Django会显示详细的错误页面,如果设置为False则会显示标准404页面。但这里我们不需要修改DEBUG设置,因为我们需要调试信息。 引用[2]提到admin应用需要在根urls.py中配置,通常使用`path('admin/', admin.site.urls)`。 引用[3]是关于favicon.ico的404错误,但用户的问题不是关于favicon的。 引用[4]是关于模板上下文处理器的配置,与当前问题无关。 分析问题: 错误由`django.contrib.admin.sites.catch_all_view`引发,这通常是因为Django的admin应用捕获了所有未匹配的URL。这意味着我们尝试访问的URL(`/docs/`)没有被任何URL模式匹配到,因此被admin的catch-all视图捕获并抛出404。 可能的原因: 1. 项目中根本没有配置`/docs/`的路由。 2. 配置了`/docs/`的路由,但是在admin的路由之后(因为admin路由通常放在最后,并使用catch-all)。 解决方案步骤: 1. 检查项目根URL配置(通常是项目目录下的urls.py),确认是否已经为`/docs/`配置了路由。 2. 确保`/docs/`的路由配置在admin路由之前,因为URL匹配是从上到下的。 回顾用户之前的问题: 用户之前询问了Core API和OpenAPI的区别,并可能按照推荐选择了OpenAPI(使用drf-yasg)或Core API(DRF内置)来生成文档。 如果是使用DRF内置的Core API文档: 配置可能是这样的: ```python from rest_framework.documentation import include_docs_urls urlpatterns = [ # ... 其他路由 path('docs/', include_docs_urls(title='API文档')), ] ``` 如果是使用drf-yasg(OpenAPI): 配置可能是这样的: ```python from drf_yasg.views import get_schema_view from drf_yasg import openapi schema_view = get_schema_view( openapi.Info(...), public=True, ) urlpatterns = [ # ... 其他路由 path('docs/', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'), ] ``` 但是,如果这些配置被放在了admin路由之后,那么当访问`/docs/`时,会先被admin的路由捕获(因为admin路由通常有一个`admin/`前缀,但是admin还有一个catch-all视图用于处理所有未匹配的URL,包括不以`admin/`开头的URL?实际上,admin的catch-all视图只会捕获以admin开头的URL吗?) 实际上,Django admin的URL配置通常只匹配以`admin/`开头的URL。但是,我们注意到用户引用[2]中给出的例子是`path('root/', admin.site.urls)`,也就是说,如果配置了`path('root/', admin.site.urls)`,那么只有以`root/`开头的URL才会被admin处理。但是,如果用户没有正确配置,可能会导致admin的catch-all视图捕获了其他URL。 然而,在默认情况下,admin的URL配置不会捕获非admin开头的URL。因此,问题可能在于用户根本没有配置`/docs/`的路由。 但是,用户明确表示错误是由`django.contrib.admin.sites.catch_all_view`引发的,这意味着这个请求被admin应用处理了。这通常发生在以下情况: - 用户配置了一个admin路由,但没有指定前缀(即空字符串),例如:`path('', admin.site.urls)`。这样,admin就会成为根路由,并且会捕获所有请求(包括`/docs/`)。 - 或者,用户配置了`path('admin/', admin.site.urls)`,但是admin.site.urls中有一个catch-all视图用于处理admin下的所有未匹配URL。但是,如果访问的是`/docs/`,它不属于admin,所以不应该被admin捕获。 所以另一种可能是:用户在urlpatterns中先配置了admin,然后配置了docs,但是admin的配置使用了空字符串前缀,或者docs的路径拼写错误导致没有匹配上。 因此,具体解决步骤: 步骤1:检查根urls.py,确认urlpatterns中是否有为`/docs/`配置的路由。 步骤2:确保`/docs/`的路由配置在admin路由之前(尽管通常admin不会捕获非admin开头的URL,但为了防止其他情况,把自定义路由放在前面是好的做法)。 步骤3:检查admin路由的配置,确保它的前缀不是空字符串(除非有特殊理由),并且它应该只捕获以指定前缀(如`admin/`)开头的URL。 如果用户确实没有配置`/docs/`路由,那么需要根据使用的文档工具进行配置。 另外,注意:如果用户使用的是Core API,那么需要确保已经安装了DRF并且正确配置了路由;如果使用的是drf-yasg,需要确保已经安装并在urls.py中配置。 下面给出一个示例的urls.py配置(使用drf-yasg): ```python from django.contrib import admin from django.urls import path, include from drf_yasg.views import get_schema_view from drf_yasg import openapi schema_view = get_schema_view( openapi.Info( title="API文档", default_version='v1', description="API描述", terms_of_service="https://www.google.com/policies/terms/", contact=openapi.Contact(email="contact@xyz.local"), license=openapi.License(name="BSD License"), ), public=True, ) urlpatterns = [ # 注意:将自定义路由放在admin路由之前 path('docs/', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'), path('admin/', admin.site.urls), # admin路由 # ... 其他路由 ] ``` 如果用户使用的是Core API: ```python from django.contrib import admin from django.urls import path from rest_framework.documentation import include_docs_urls urlpatterns = [ path('docs/', include_docs_urls(title='API文档')), path('admin/', admin.site.urls), # ... 其他路由 ] ``` 步骤4:如果配置了路由但仍然出现404,检查是否在子应用中配置了相同的路径,导致冲突。 步骤5:确保Django服务器已经重启,以便配置生效。 总结解决方案: 1. 在根urls.py中正确配置`/docs/`路由(使用OpenAPI或Core API的相应视图)。 2. 确保这个路由在admin路由之前。 3. 避免admin路由使用空字符串前缀(除非你明确想要让admin处理所有请求)。 特别提醒:用户引用[2]中给出的例子是`path('root/', admin.site.urls)`,这说明用户可能将admin配置在了`root/`路径下,那么访问`/docs/`不应该被admin捕获。所以,最可能的原因是没有配置`/docs/`路由。 因此,请首先检查是否配置了`/docs/`路由。 如果用户没有配置,那么按照上述示例配置即可。 如果已经配置,请检查路由顺序和路径是否正确。 此外,还要注意:如果项目使用了多个urls.py文件(例如,使用了include包含其他应用的urls),请确保`/docs/`路由是直接定义在根urls.py中,而不是被其他include覆盖。 最后,如果用户使用的是Core API,还需要确保在INSTALLED_APPS中配置了`rest_framework`。 根据上述思路,给出具体回答。 </think> 在Django项目中访问`http://127.0.0.1:8000/docs/`出现404错误且由`django.contrib.admin.sites.catch_all_view`引发,通常是由于URL配置冲突或文档路由未正确注册所致。以下是系统化的解决方案: --- ### 根本原因分析 1. **URL配置冲突** Django的URL匹配遵循**从上到下**的顺序。当`admin.site.urls`注册在自定义路由(如`/docs/`)之前时,Admin会优先捕获所有未匹配的请求[^2]。 2. **路由未正确注册** `/docs/`路径未在根`urls.py`中注册,或视图函数未正确关联。 3. **Admin的catch-all机制** `django.contrib.admin.sites.catch_all_view`是Admin应用的全局捕获视图,会处理所有未匹配的URL[^1]。 --- ### 解决方案(逐步操作) #### 步骤1:检查根URL配置 在项目目录下的`urls.py`中,**确保文档路由注册在admin路由之前**: ```python # myproject/urls.py from django.contrib import admin from django.urls import path from rest_framework.documentation import include_docs_urls # Core API # 或 from drf_yasg.views import get_schema_view # OpenAPI (drf-yasg) urlpatterns = [ # 文档路由必须放在admin之前 path('docs/', include_docs_urls(title='API文档')), # Core API # 或使用OpenAPI (drf-yasg) # path('docs/', get_schema_view().with_ui('swagger', cache_timeout=0)), path('admin/', admin.site.urls), # Admin路由在后 ] ``` **关键点**: - `/docs/`必须在`/admin/`之前声明 - 错误的顺序会导致Admin优先捕获`/docs/`请求[^2] #### 步骤2:验证文档视图配置 根据使用的工具确认配置: - **Core API验证** 确保`INSTALLED_APPS`包含`rest_framework` ```python # settings.py INSTALLED_APPS = [ ... 'rest_framework', ] ``` - **OpenAPI (drf-yasg) 验证** 1. 安装包:`pip install drf-yasg` 2. 添加配置: ```python # settings.py INSTALLED_APPS = [ ... 'drf_yasg', ] ``` #### 步骤3:调试模式检查 当`DEBUG=True`时,Django会显示详细错误(如未配置路由)[^1]: ```python # settings.py DEBUG = True # 开发环境保持True ``` 访问`/docs/`时若显示`Page not found (404)`,说明路由未注册或路径错误。 #### 步骤4:处理静态文件冲突(可选) 如果`/docs/`路径被静态文件占用,需排除冲突: ```python # urls.py urlpatterns = [ path('docs/', ...), # API文档 path('admin/docs/', include('django.contrib.admindocs.urls')), # Admin文档 ] ``` #### 步骤5:完整配置示例 ```python # myproject/urls.py from django.contrib import admin from django.urls import path from rest_framework.documentation import include_docs_urls from drf_yasg.views import get_schema_view from drf_yasg import openapi # OpenAPI配置 schema_view = get_schema_view( openapi.Info(title="API文档", default_version='v1'), public=True, ) urlpatterns = [ # 文档路由(二选一) path('docs/', include_docs_urls(title='Core API文档')), # Core API path('swagger/', schema_view.with_ui('swagger')), # OpenAPI # Admin路由(必须在后) path('admin/', admin.site.urls), ] ``` --- ### 验证结果 1. 重启服务:`python manage.py runserver` 2. 访问正确路径: - Core API:`http://127.0.0.1:8000/docs/` - OpenAPI:`http://127.0.0.1:8000/swagger/` 3. 若仍报404,检查终端输出是否有路由注册错误。 --- ### 预防措施 1. **路由顺序原则** 通用路由(如`/docs/`)在前,框架路由(如`/admin/`)在后 $$ \text{urlpatterns} = [\text{custom_paths}] + [\text{framework_paths}] $$ 2. **使用命名空间隔离** ```python path('api/docs/', include('api_docs.urls', namespace='docs')) ``` 3. **定期检查catch-all视图** 当看到`django.contrib.admin.sites.catch_all_view`错误时,立即检查路由顺序[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值