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 作为参数传递?