python - DRF 不反转 Django url 模式:NoReverseMatch
问题描述
有一个复杂的应用程序(不可能只粘贴代码)。打算解释一下。
姜戈
有一个urls.py
来自原生 Django 应用程序的文件。定义并注册其urlpatterns
网址。^foo/
定义了一组相关的 url和foonamepsace
.
urlpatterns = patterns('',
...
url(r'^foo/', include('foo.urls', namespace='foonamespace')),
...
现在有一个方法generate_report
可以在内部执行一些逻辑,然后用于render_to_string
返回 HTML:
def generate_report(..):
...
return render_to_string('foo/foo_report.html', args)
应用程序内部一切正常,url 成功反转。
Django 休息框架 (DRF)
现在有一个 DRF 实现,它的资源之一应该以二进制格式返回报告。
class PDFReportViewSet(APIView):
renderer_classes = (BinaryFileRenderer, )
def get(..):
...
pdf = generate_report() # <-- fails with NoReverseMatch
...
return response
问题
ViewSet
调用,但是在generate_report
尝试解析 HTML 时出现错误:
NoReverseMatch: foonamespace' 不是注册的命名空间
问题
为什么 DRF 不能从 Django 应用程序的核心反转名称空间/URL 的任何线索?如何确保 DRF 可以从核心反转命名空间urls.py
urlpattern
?
添加
经过调查,在foo_report.html
URL 的任何使用中,例如{% url 'foonamespace:123' %}
或{% url 'barnamespace:123' %}
产生错误 -仅当从 DRF运行时(使用本机 Django 运行相同的页面工作正常)。
网址
foo.urls.py
from django.conf.urls import patterns, url
from foo.views import (FooListView, FooDetailView...)
urlpatterns = patterns('',
url(r'^$', FooListView.as_view(), name='foo_list'),
url(r'^(?P<pk>\d+)/$', FooDetailView.as_view(), name='foo_details'),
重要的提示。该应用程序在some.domain.com/上提供服务,而 REST在some.domain.com/rest上提供服务。所以可能是这种方式/rest
不包括任何东西,因为它是根的父级(包括foo.urls.py
)
解决方案
在@dirkgroten 的帮助下,我设法解决了我的问题。不看源代码很难看出问题。
解决方案
更新了routers.py
文件:
urlpatterns = router.urls
urlpatterns += patterns('',
url(r'^foo/', include('foo.urls', namespace='foonamespace')),
)
解释
基本上,该应用程序是从根 url 提供的,/
而其余的则是从/rest
. DRF 路由器根本不包括任何根路由。像显示的那样手动添加它们solution
解决了问题并且foonamespace
对所有 DRF 元素可见。
推荐阅读
- php - Codeigniter 4 cookie 问题无法设置
- javascript - 将 JS 测验的正确答案设为绿色,将错误答案设为红色
- java - Java 中 x + x 和 2*x 的区别
- python - REST API url 设计
- python - 使用 Plotly 和 Flask 的雷达图
- postgresql - 如何设置创建某些行的日期?我试图在 PostgreSQL 中只使用触发器和函数
- bash - 如何复制特定文本下方的特定行?
- c++ - 从 int 到 char 的转换失败,控制台打印出奇怪的符号
- python-3.x - 如何在 Pandas 中使用正则表达式?
- python - 如何重新着色图像中的多个像素 - Python