我正在处理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
答案 0 :(得分:0)
Django 2.0及更高版本现在使用path
func构造函数来指定URL。我不确定是否还有向后兼容性;您可以通过一个简单的示例进行尝试。但是,如果您开始编写应用程序,则应使用path
:
path('api/<str:encoded_url>/', view_action)
为避免与标准路径混淆,请不要使用path
转换器而不是str
(前者可让您匹配/
,而其他没有)。
使用此article,您可以获得从url
到path
过渡的更多帮助。
第二步,在视图中获取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)