【问题标题】:django ignore slash in url and take parameterdjango 忽略 url 中的斜杠并获取参数
【发布时间】:2018-04-28 12:29:23
【问题描述】:

嗨,我有这样的网址:

path('api/v1/store/download/<str:ix>/', DownloadVideoAPI.as_view(), name='download'),

它接受长字符串。

我想保留上面网址中download 之后的所有内容作为参数。

但是当我输入一个包含一些斜杠的长字符串时,Django 会说找不到页面,例如当输入"/api/v1/store/download/asdasd2asdsadas/asdasd" 时会给我 404 not found ...

我该怎么做?

这是我的看法:

class DownloadVideoAPI(APIView):
    def get(self, request, ix):
        pre = ix.split(",")
        hash = pre[0]
        dec = pre[1]
        de_hash = decode_data(hash, dec)

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    嗯,可以在请求中添加额外的参数。你可以使用 re_path 方法。

    # urls.py
    from django.urls import re_path
    
    re_path(r'api/v1/store/download/(?P<ix>\w+)/', DownloadVideoAPI.as_view(), name='download'),
    

    参考:https://docs.djangoproject.com/en/2.0/ref/urls/#django.urls.re_path

    【讨论】:

      【解决方案2】:

      随便用

      path('api/v1/store/download/<str:ix>', DownloadVideoAPI.as_view(), name='download'),
      

      最后没有/

      【讨论】:

        【解决方案3】:

        /api/v1/store/download/asdasd2asdsadas/asdasd 将导致404 页面,因为 Django 无法将 URL /api/v1/store/download/asdasd2asdsadas/ 映射到您的 urls.py 中的路由。为了解决这个问题,除了使用 BugHunter 的 answer 之外,您还可以先对长字符串进行 URL 编码,然后再将其传递给您的 URL。

        因此,给定长字符串"asdasd2asdsadas/asdasd",URL 首先将其编码为"asdasd2asdsadas%2Fasdasd"。编码后,您的 URL 现在应该看起来像 "/api/v1/store/download/asdasd2asdsadas%2Fasdasd"。


        要在 Python 3 中进行 URL 编码,您可以使用 urllib

        import urllib
        
        parameter = 'asdasd2asdsadas/asdasd'
        encoded_string = urllib.quote(parameter, safe='')
        

        encoded_string 这里应该有值,"asdasd2asdsadas%2Fasdasd"

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-01-21
          • 1970-01-01
          • 2018-05-19
          • 1970-01-01
          • 1970-01-01
          • 2019-06-25
          • 2014-10-15
          • 1970-01-01
          相关资源
          最近更新 更多