请教一下 Django 里面的 URL 正则的写法

2015-09-19 16:49:14 +08:00
 cheerzeng
之前一直用的以下这种
url (r'^book/?P<book_id>\w{10})$', views.book, name='book')

对应的链接如: http://127.0.0.1/book/1234567890/
把 10 位的 id 作为 view 的参数跟 request 一起传过去。

最近加多了一个用户管理,想把用户 id 通过 middleware 的形式取得
对应链接如: http://127.0.0.1/book/?user_id=12345/1234567890/

那么这个 url 的正则应该怎么写呢, 试了几个都不对。

目前我把 user_id 也像第一种方法一样,就是把?user_id 去掉。
对应链接如: http://127.0.0.1/book/12345/1234567890/
正则: url (r'^book/?P<user_id>\w{5})/?P<book_id>\w{10})$', views.book, name='book')


但是因为遇到了,而且 user_id 可能长度会变,所以还是想学习一下加?user_id 的情况是要怎么写 url.

谢谢。
4088 次点击
所在节点    Python
8 条回复
felixzhu
2015-09-19 17:05:28 +08:00
URL 正则为什么要去匹配参数
guoqiao
2015-09-19 17:26:16 +08:00
1. 匹配数字应该是\d, 而不是\w
2. django 定义 url 的时候并不会理会问号后面的 get 参数, 你应该自己通过 request.GET.get ('key')获取.
3. 对于变长的数字参数使用 \d+即可, 无需指定固定位数.
4. 你的 url 里括号不匹配.

正确的格式是:
url (r'^book/(?P<user_id>\d+)/(?P<book_id>\d+)/$', views.book, name='book')
Damnever
2015-09-19 21:30:05 +08:00
不知道 http://127.0.0.1/book/?user_id=12345/1234567890/ 是几个意思,? 后面的不是 query string 么?
cheerzeng
2015-09-22 11:10:50 +08:00
@Damnever user_id 是 query string ,然后十位的那个是传给 view 的 book_id.
我应该没说错吧
cheerzeng
2015-09-22 11:12:41 +08:00
@felixzhu 因为我想把 user_id 做成 query string 的形式,然后用正则匹配中间的那串? user_id=12345
cheerzeng
2015-09-22 11:19:11 +08:00
@guoqiao
1. 这里是个笔误,因为真实代码是中间包含字符跟下划线之类的,把问题简化了一下,忘记改正则了,谢谢提醒。
2. 是的,如果不用? user_id = 12345 这种链接的话, 用两个? P 的方法确实是通过 get 可以取到。目前用的就是这个。你的意思是用 http://127.0.0.1/book/?user_id=12345/1234567890/ 这种形式,也是可以用你说的 url (r'^book/(?P<user_id>\d+)/(?P<book_id>\d+)/$', views.book, name='book') 这个匹配?
我的理解是 http://127.0.0.1/book/?user_id=12345 应该不会匹配到(?P<user_id>\d+) 吧?我回头试试

3.学习了。
4, 应该也是笔误。
Damnever
2015-09-22 19:12:47 +08:00
@cheerzeng 懂了,不过你这种还真不多见
cheerzeng
2015-09-22 22:53:17 +08:00
@Damnever 是嘛,哈哈,碰到了就看一下怎么解决,即便可能用不上

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/222007

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX