Django Rest 框架 - 主 url HTTP/1.1" 404 Not Found

Posted

技术标签:

【中文标题】Django Rest 框架 - 主 url HTTP/1.1" 404 Not Found【英文标题】:Django Rest Framework - main url HTTP/1.1" 404 Not Found 【发布时间】:2017-04-24 00:18:27 【问题描述】:

我在我的项目主 urls.py 文件中有以下内容:

# REST Framework packages
from rest_framework import routers
router = routers.DefaultRouter()

# ... My viewsets serialized
router.register(r'users', UserViewSet) 
# ... Another viewsets 
urlpatterns = [

    url(r'^$', HomeView.as_view(), name='home'),
    # Home url in my project        

    url(r'^', include('userprofiles.urls')),
    # Call the userprofiles/urls.py application

    url(r'^pacientes/',  include('userprofiles.urls', namespace='pacientes')),
    # Patients url

    url(r'^api/', include(router.urls)),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
    # Rest frameworks urls
]

直到这里,当我在浏览器中输入调用本地服务器 http://localhost:8000/api/ 时,我得到了类似的响应:

[08/Dec/2016 16:39:42] "GET /api/ HTTP/1.1" 200 7084

我的 REST url's 序列化模型出现

之后,我在userprofiles/urls.py 应用程序中用这种方式的一些正则表达式创建了一个额外的url:

from .views import PatientDetail
urlpatterns = [
    url(r'^(?P<slug>[\w\-]+)/$', PatientDetail.as_view(), name='patient_detail'),

]

而且,当我转到 http://localhost:8000/api/ 时,我会收到以下回复:

Not Found: /api/
[08/Dec/2016 16:42:26] "GET /api/ HTTP/1.1" 404 1753

没有找到我的rest frameworks url,在我的浏览器中,表示调用PatientDetailView的url是这个问题的根源:

我的 PatientDetailView 有以下内容:

class PatientDetail(LoginRequiredMixin, DetailView):
    model = PatientProfile
    template_name = 'patient_detail.html'
    context_object_name = 'patientdetail'

    def get_context_data(self, **kwargs):
        context=super(PatientDetail, self).get_context_data(**kwargs)
    # And other actions and validations here in forward ...

userprofiles/urls.py 中定义的正则表达式中我正在做:

url(r'^(?P<slug>[\w\-]+)/$', PatientDetail.as_view(), name='patient_detail')

模型 PatientProfile 有一个 slug 字段(患者的用户名)。我在 url 中传递了这个 slug。

此外,我希望[\w\-] 参数允许我使用大写和小写字母数字字符,并允许多次使用下划线和连字符。

我的正则表达式可能是问题的根源吗? 找不到与我的/api django-restframework url 相关的情况?

【问题讨论】:

【参考方案1】:

api 完全匹配在 'userprofiles.urls' 中使用的正则表达式 [\w\-]+。所以当你输入http://localhost:8000/api/ 时,Django 会返回第一个找到的 urlpattern,即url(r'^', include('userprofiles.urls'))。尝试换行:

url(r'^pacientes/',  include('userprofiles.urls', namespace='pacientes')),
# Patients url
url(r'^api/', include(router.urls)),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
url(r'^', include('userprofiles.urls')),

【讨论】:

【参考方案2】:

您定义网址的顺序很重要。 Django 尝试将您的 URL 与每个模式匹配,直到其中一个匹配。

请注意,您包含了这一行:

url(r'^', include('userprofiles.urls')),

之前:

url(r'^api/', include(router.urls)),

这不是问题,因为第一个匹配的模式是后者。

但是,当您添加 PatientDetail 查看 URL 模式时:

url(r'^(?P<slug>[\w\-]+)/$', PatientDetail.as_view(), name='patient_detail')

/api/ 匹配。因此,PatientDetail 视图被调用并且您的 404 错误发生,因为没有找到用户名 api 的患者,而不是因为找不到 URL。

【讨论】:

以上是关于Django Rest 框架 - 主 url HTTP/1.1" 404 Not Found的主要内容,如果未能解决你的问题,请参考以下文章

Django + AngularJS:没有使用普通 URL 和视图的 Django REST 框架的类 REST 端点?

使用 django-rest 框架中的 GET 方法将 url 作为参数传递?

嵌套 url 不适用于 Django REST 框架

在 django rest 框架中定义 searchFilter URL

django rest框架动态url路由

Django REST 框架:使用 URL 中的 ID 发布到 URL