【问题标题】:Django given URL path name get URLDjango 给定 URL 路径名获取 URL
【发布时间】: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 所做的),然后确定所需的参数数量,以便您可以提供有效的反向调用。

标签: python django url


【解决方案1】:
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.reverse import reverse as api_reverse


class HomeView(APIView):
    def get(self, request, format=None):
        data = {
            "api": {
                "search_api":  api_reverse("reindex", request=request),
            },

        }
        return Response(data)

【讨论】:

    猜你喜欢
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 2021-04-12
    • 2021-03-31
    • 1970-01-01
    • 2014-08-26
    相关资源
    最近更新 更多