Django2.0 的路由配置中,如何用Python匹配任意字符

在 django2.0 中不再使用正则表达式进行路由匹配,而是启用了新的路由配置,更加简洁

str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
int,匹配正整数,包含 0。
slug,匹配字母、数字以及横杠、下划线组成的字符串。
uuid,匹配格式化的 uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
path,匹配任何非空字符串,包含了路径分隔符

我的问题是如何匹配任意字符,需要使用自定义吗? 我需要实现的是当用户访问/history或者/history/任意字符事都跳转到 history 页面,在不使用正则的情况下可以实现吗,试了上面的自带的路由转化器,似乎没有达到想要的效果。也有可能我没太读懂这个转换器的意思,请支出。 或者在同一条路由配置中,可以使用多个匹配方式吗? 我是一个初学者,希望能够得到大家的帮助,谢谢!

def view_history(request,history):
    return HttpResponse('这是观看历史页')

path(‘此处如何匹配’,views.view_history),


Django2.0 的路由配置中,如何用Python匹配任意字符

6 回复

re_path 正则路由,了解一下?


在Django 2.0+的路由配置中,要匹配任意字符,主要用path()转换器或re_path()正则。最直接的是用path()<path:>转换器,它能匹配包含斜杠/在内的任意字符。如果不需要匹配斜杠,就用<str:><slug:>。需要更复杂匹配时就用re_path()写正则。

1. 用 path()<path:> 转换器 这个能匹配包括/的任意非空字符串,适合匹配路径。

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('files/<path:file_path>/', views.file_view, name='file_view'),
]

视图函数里就能拿到file_path参数:

# views.py
def file_view(request, file_path):
    # file_path 可以是 "docs/readme.txt" 这样的带斜杠的路径
    return HttpResponse(f"File path: {file_path}")

2. 用 path() 的其他转换器 如果不需要匹配斜杠:

  • <str:>:匹配任意非空字符串,但不包括/
  • <slug:>:匹配字母、数字、连字符、下划线组成的字符串。

3. 用 re_path() 写正则表达式 需要复杂匹配时就用这个,比如要匹配特定模式。

# urls.py
from django.urls import re_path
from . import views

urlpatterns = [
    # 正则 .* 匹配任意字符(包括空字符串)
    re_path(r'^match/(?P<content>.*)/$', views.match_view, name='match_view'),
]

视图函数:

# views.py
def match_view(request, content):
    # content 可以是任意字符串,包括空字符串
    return HttpResponse(f"Matched: {content}")

总结:

  • 要匹配带斜杠的路径就用<path:>
  • 不要斜杠就用<str:><slug:>
  • 复杂匹配上正则re_path()

一句话建议:根据要不要斜杠选path转换器,复杂的用re_path

有了新的路由方式,就感觉不想用正则了,毕竟本来也就不熟悉正则,看的头大

试试 path(<path:name>, views.view_history),

前面书写错误,手机修改内容太麻烦了。
path(‘history/<path:name>/’, views.view_history),

你好,我遇到同样的问题,你解决了吗?我是想匹配 53_P_1495068879687.jpg ,上面没有一个符合需求的

回到顶部