在 Django Urls 中传递一个 URL 作为参数

Abd*_*man 6 python django django-urls

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

网址.py:

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

视图.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'
Run Code Online (Sandbox Code Playgroud)

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

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

小智 5

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

path('api/<str:encoded_url>/', view_action)
Run Code Online (Sandbox Code Playgroud)

为了避免与在您的应用程序中查看的标准路径混淆,我不建议使用path转换器而不是str(前者可以让您匹配/,而另一个则不能)。

您可以通过这篇文章获得更多关于从url到转换的帮助。path

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

您可以轻松地对 url 进行编码和解码urllib(还有其他模块)。对于 Python 3.7 语法如下(文档在这里)

>>> urllib.parse.quote("http://www.google.com")
'http%3A//www.google.com'
>>> urllib.parse.unquote('http%3A//www.google.com')
'http://www.google.com'
Run Code Online (Sandbox Code Playgroud)

请记住:如果您在不引用的情况下传递 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 传递通常不是 ebst 实践(尽管完全可能)。