django在url中忽略斜杠并取参数

时间:2018-04-28 12:29:23

标签: python django django-rest-framework

嗨,我有这样的网址:

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

它接受长串。

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

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

我该怎么做?

这是我的观点:

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

3 个答案:

答案 0 :(得分:0)

只需使用

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

最后没有/

答案 1 :(得分:0)

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

因此,给定长字符串"asdasd2asdsadas/asdasd",URL会先将其编码为"asdasd2asdsadas%2Fasdasd"。对代码进行编码后,您的网址现在应该显示为"/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"

答案 2 :(得分:0)

嗯,可以在请求中添加额外的参数。你可以使用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