【发布时间】:2020-12-11 20:45:25
【问题描述】:
我正在尝试创建一个视图,该视图将列出服务器上可用的 URL。
给定一个像这样的 url 路径:
path(r'reindex_search', views.IndexView.as_view(), name='reindex')
如果给定名称“reindex”,我如何从views.py 中获取完整路径(例如“http://localhost:8000/reindex_search”)?
我尝试使用 rest_framework.reverse,它适用于我的一些端点,但在路径中有变量的 url 上失败。到目前为止,这是我的尝试:
urls.py
api_root_dict = OrderedDict()
...
api_root_dict['reindex_search'] = 'reindex'
...
urlpatterns = [
...
path(r'reindex_search', views.IndexView.as_view(), name='reindex'),
path('api/', views.HomeView.as_view(api_root_dict=api_root_dict), name='home'),
...
views.py
class HomeView(APIView):
api_root_dict = None
def get(self, request, *args, **kwargs):
ret = OrderedDict()
namespace = request.resolver_match.namespace
for key, url_name in self.api_root_dict.items():
if namespace:
url_name = namespace + ":" + url_name
try:
ret[key] = {
'href': reverse(
url_name,
args=args,
kwargs=kwargs,
request=request,
format=kwargs.get('format', None)
)
}
except NoReverseMatch:
continue
home_url = reverse(viewname='home', request=request)
obj = {
'_links': {
'self': {"href": home_url},
**ret
}
}
return Response(obj)
例如,对于我的 app's urls.py 中的以下路径,这将失败:
path('<str:endpoint>/schema', views.schema, name='schema')
将此添加到根字典中:
api_root_dict['schema'] = 'schema'
(失败是指 NoReverseMatch 异常)
一定有更好的方法。 Django 模板如何使用 url 键工作?
【问题讨论】:
-
为什么要通过自定义字典(api_root_dict)而不是所有的 urlpatterns 进行搜索?
-
是的,好点。
-
你得到反向匹配失败,因为路径需要参数并且你没有提供确切数量的参数。但是,您可以正则表达式解析路径(这也是 Django 所做的),然后确定所需的参数数量,以便您可以提供有效的反向调用。