【问题标题】:how to ignore forward slash from django URL in a parameter如何在参数中忽略来自 django URL 的正斜杠
【发布时间】:2019-10-21 20:14:14
【问题描述】:

我使用的是 django 版本 2.2.5。下面是我的 urls.py

from django.urls import path, include
from . import views

urlpatterns = [
   path('manifest/', views.home),
   path('manifest/<str:some_id>/', views.manifest),
]

当 some_id 不包含任何正斜杠(/)时,它可以正常工作。例如。 http://127.0.0.1:8000/manifest/name:19.2.4:develop:1/

在views.py的以下清单函数中,我可以获取some_id

def manifest(request, some_id):
     print(some_id)

##prints below:
##[21/Oct/2019 19:36:55] "GET /manifest/name:19.2.4:develop:1 HTTP/1.1" 301 0
##name:19.2.4:develop:1

但是,当 some_id 中包含正斜杠时,我没有得到整个 id。例如,如果我将“develop”替换为“release/19.2.4”http://127.0.0.1:8000/manifest/name:19.2.4:release/19.2.4:1/

,则从上面的 URL
"GET /manifest/name:19.2.4:release/19.2.4:1/ HTTP/1.1" 404 3080

这是因为正斜杠被用作分隔符。有什么方法可以忽略 some_id 参数中的这个正斜杠吗?期望在views.py中获得 name:19.2.4:release/19.2.4:1 作为 some_id

注意:有效的 some_id 的格式是它有 4 个部分,由“:”分隔。例如:name:version:branch:num,其中只有分支部分可以有一个或多个斜杠(/)。

【问题讨论】:

  • 您可以具体并使用regex 而不仅仅是路径,或者您可以使用path 而不是str 作为path converter,它允许使用正斜杠。
  • @dirkgroten。谢谢。 path 工作。

标签: python django django-rest-framework restful-url


【解决方案1】:

您可能想使用好的 ol' re_path 在你的情况下,这会给

from django.urls import path, re_path, include
from . import views

urlpatterns = [
   path('manifest/', views.home),
   re_path(r'manifest/(?P<some_id>\w+)/', views.manifest),
]

您的网址是结构化的,您是否尝试过类似的方法:

path('manifest/<str:name>:<str:version>:<path:branch>:<str:num>/', views.manifest),

【讨论】:

  • 谢谢。这是一个很好的观点,因为在这种情况下 URL 是结构化的。 path('manifest/&lt;str:name&gt;:&lt;str:version&gt;:&lt;path:branch&gt;:&lt;str:num&gt;/', views.manifest), 我将使用上面的,将 str 替换为 path 仅用于分支部分,因为它可以包含正斜杠(“/”)
猜你喜欢
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
  • 2011-12-14
  • 1970-01-01
  • 1970-01-01
  • 2018-05-19
  • 1970-01-01
  • 2019-06-25
相关资源
最近更新 更多