V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
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 · Sep 19, 2015 · 4848 views
    This topic created in 3885 days ago, the information mentioned may be changed or developed.
    之前一直用的以下这种
    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.

    谢谢。
    Supplement 1  ·  Sep 22, 2015
    更新,今晚试了一下,貌似要这样子写:

    >>> 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 replies    2015-09-22 22:53:17 +08:00
    felixzhu
        1
    felixzhu  
       Sep 19, 2015
    URL 正则为什么要去匹配参数
    guoqiao
        2
    guoqiao  
       Sep 19, 2015
    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  
       Sep 19, 2015
    不知道 http://127.0.0.1/book/?user_id=12345/1234567890/ 是几个意思,? 后面的不是 query string 么?
    cheerzeng
        4
    cheerzeng  
    OP
       Sep 22, 2015
    @Damnever user_id 是 query string ,然后十位的那个是传给 view 的 book_id.
    我应该没说错吧
    cheerzeng
        5
    cheerzeng  
    OP
       Sep 22, 2015
    @felixzhu 因为我想把 user_id 做成 query string 的形式,然后用正则匹配中间的那串? user_id=12345
    cheerzeng
        6
    cheerzeng  
    OP
       Sep 22, 2015
    @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  
       Sep 22, 2015
    @cheerzeng 懂了,不过你这种还真不多见
    cheerzeng
        8
    cheerzeng  
    OP
       Sep 22, 2015
    @Damnever 是嘛,哈哈,碰到了就看一下怎么解决,即便可能用不上
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3034 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 13:34 · PVG 21:34 · LAX 06:34 · JFK 09:34
    ♥ Do have faith in what you're doing.