在Django Urls中将网址作为参数传递

时间:2018-09-05 15:28:54

标签: python django django-urls

我正在处理Django(2)项目,在该项目中,我需要将URL作为参数传递给Django URL, 这是我尝试过的:

urls.py:

urlpatterns = [
path('admin/', admin.site.urls),
url(r'^api/(?P<address>.*)/$', PerformImgSegmentation.as_view()),
]

views.py:

class PerformImgSegmentation(generics.ListAPIView):
    def get(self, request, *args, **kwargs):
        img_url = self.kwargs.get('address')
        print(img_url)
        print('get request')
    return 'Done'

但是它不起作用,我通过邮递员传递了一个名为address的参数,但是失败了。 它返回此错误:

  

未找到:/ api /   [05 / Sep / 2018 15:28:06]“ GET / api / HTTP / 1.1” 404 2085

3 个答案:

答案 0 :(得分:0)

Django 2.0及更高版本现在使用path func构造函数来指定URL。我不确定是否还有向后兼容性;您可以通过一个简单的示例进行尝试。但是,如果您开始编写应用程序,则应使用path

path('api/<str:encoded_url>/', view_action)

为避免与标准路径混淆,请不要使用path转换器而不是str(前者可让您匹配/,而其他没有)。

使用此article,您可以获得从urlpath过渡的更多帮助。

第二步,在视图中获取encoded_url作为参数。您需要对其进行解码:要在get url中传递一个url,请使用ASCII编码,该编码将某些保留字符替换为其他保留字符(例如,正斜杠)。

您可以使用urllib(还有其他模块)轻松地对URL进行编码和解码。对于Python 3.7,语法如下(docs here)

>>> urllib.parse.quote("http://www.google.com")
'http%3A//www.google.com'
>>> urllib.parse.unquote('http%3A//www.google.com')
'http://www.google.com'

请记住:如果您在不引用的情况下传递url,则该URL将不匹配:您不接受该路径表达式的斜杠匹配。 (编辑:quote方法默认不转换正斜杠,因为您需要传递:quote(<str>, safe='')

例如,您的GET调用应为:/api/http%3A%2F%2Fwww.google.com。但是,最好将URL作为get参数传递,并且在路径中只关心可读取性(例如/api/name_to_my_method?url=http%3A%2F%2Fwww.google.com)。路径工程对于提高可读性很重要,并且通常不推荐使用通过引号引起来的URL(尽管完全有可能)。

答案 1 :(得分:0)

您是否要尝试将django模板中的网址https://i.imgur.com/TGJHFe1.jpg作为参数传递给视图?

您可以简单地在应用程序的url.py中编写:

path(api/<path:the_url_you_want_to_pass>', PerformImgSegmentation.as_view())

请查看此article

答案 2 :(得分:-1)

Django 2.0提供了Path Converters来将路径参数转换为适当的类型,其中还包括urls的转换器,请看一下docs

因此,您的网址可以像这样:

path('api/<path:encoded_url>/', PerformImgSegmentation.as_view()),

因此,path转换器将匹配任何非空字符串,包括路径分隔符'/'。这样一来,您就可以匹配完整的URL路径,而不是像str那样仅匹配URL路径的一部分。

然后在视图中,我们可以像这样从 URL 中获取kwargs值:

img_url = self.kwargs.get('encoded_url')
print(img_url)