Django中传递管道分隔字符串作为URL参数路由失败求助
解决Django中管道分隔字符串作为URL参数的路由问题
嘿,我一眼就看出问题出在哪了——你的URL正则表达式太严格啦!
你当前用的正则[a-zA-Z0-9_]+只能匹配字母、数字和下划线,但你的参数里包含管道符(|)、连字符(-)、空格这些字符,正则根本匹配不上,自然就没法路由到对应的视图了。
下面给你两种解决方案,按需选择:
方案一:宽松匹配(推荐,适合参数包含多种特殊字符的情况)
直接用[^/]+作为正则,它会匹配所有斜杠以外的字符,完美覆盖你参数里的管道、空格、连字符这些:
from django.conf.urls import url from django.views.generic import RedirectView from alerter import views app_name = 'alerter' urlpatterns = [ url(r'^main/(?P<message>[^/]+)/$', views.TheView.as_view({'get': 'your_get_handler_method'})), ]
方案二:精确匹配(如果想严格限制允许的字符)
如果你不想太宽松,可以明确列出所有允许的字符,注意正则里的特殊字符要转义(比如|要写成\|,-放在字符集的开头/结尾就不用转义):
from django.conf.urls import url from django.views.generic import RedirectView from alerter import views app_name = 'alerter' urlpatterns = [ url(r'^main/(?P<message>[a-zA-Z0-9_\|\-\s]+)/$', views.TheView.as_view({'get': 'your_get_handler_method'})), ]
额外提醒
- URL里的空格会被自动编码成
%20,Django会帮你自动解码,所以视图里拿到的message参数就是带空格的原始字符串,不用额外处理。 - 如果你的参数未来可能包含
&、?这类URL特殊符号,更建议改用查询参数的方式传递,比如/main/?message=你的管道分隔字符串,这样就不用纠结路径正则的问题了,直接在视图里用request.GET.get('message')获取即可。
内容的提问来源于stack exchange,提问作者DisplayName
相关产品推荐
相关产品推荐

