V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
cheerzeng
V2EX  ›  Python

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

  •  1
     
  •   cheerzeng · 2015-09-19 16:49:14 +08:00 · 4054 次点击
    这是一个创建于 3148 天前的主题,其中的信息可能已经有所发展或是发生改变。
    之前一直用的以下这种
    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.

    谢谢。
    第 1 条附言  ·  2015-09-22 23:10:12 +08:00
    更新,今晚试了一下,貌似要这样子写:

    >>> url = r"www.baidu.com\?user_id=1234567\12345"
    >>> p = re.compile(r'www.baidu.com\\\?user\_id\=\d{7}\\\d{5}')
    >>> m= p.match(url)
    >>> print m.group()
    www.baidu.com\?user_id=1234567\12345


    这也太不好看了吧。。。
    8 条回复    2015-09-22 22:53:17 +08:00
    felixzhu
        1
    felixzhu  
       2015-09-19 17:05:28 +08:00
    URL 正则为什么要去匹配参数
    guoqiao
        2
    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
        3
    Damnever  
       2015-09-19 21:30:05 +08:00
    不知道 http://127.0.0.1/book/?user_id=12345/1234567890/ 是几个意思,? 后面的不是 query string 么?
    cheerzeng
        4
    cheerzeng  
    OP
       2015-09-22 11:10:50 +08:00
    @Damnever user_id 是 query string ,然后十位的那个是传给 view 的 book_id.
    我应该没说错吧
    cheerzeng
        5
    cheerzeng  
    OP
       2015-09-22 11:12:41 +08:00
    @felixzhu 因为我想把 user_id 做成 query string 的形式,然后用正则匹配中间的那串? user_id=12345
    cheerzeng
        6
    cheerzeng  
    OP
       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
        7
    Damnever  
       2015-09-22 19:12:47 +08:00
    @cheerzeng 懂了,不过你这种还真不多见
    cheerzeng
        8
    cheerzeng  
    OP
       2015-09-22 22:53:17 +08:00
    @Damnever 是嘛,哈哈,碰到了就看一下怎么解决,即便可能用不上
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2135 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 04:55 · PVG 12:55 · LAX 21:55 · JFK 00:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.