繁体   English   中英

Django 给定 URL 路径名得到 URL

[英]Django given URL path name get URL

我正在尝试创建一个视图,该视图将列出服务器上可用的 URL。

给定一个 url 路径,如下所示:

path(r'reindex_search', views.IndexView.as_view(), name='reindex')

在给定名称“reindex”的情况下,如何从views.py 中获取完整路径(例如“http://localhost:8000/reindex_search”)?

我尝试使用 rest_framework.reverse ,它适用于我的一些端点,但在路径中有变量的 url 上失败。 到目前为止,这是我的尝试:

网址.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'),
    ...

视图.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)

例如,对于我的应用程序的urls.py 中的以下路径,这将失败:

path('<str:endpoint>/schema', views.schema, name='schema')

将此添加到根字典中:

api_root_dict['schema'] = 'schema'

(失败是指 NoReverseMatch 异常)

一定会有更好的办法。 Django 模板如何使用 url 键工作?

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM