• 路由系统


     

    Django处理请求的流程

    1. 进来的请求转入/hello/.
    2. Django通过在ROOT_URLCONF配置来决定根URLconf.
    3. Django在URLconf中的所有URL模式中,查找第一个匹配/hello/的条目。
    4. 如果找到匹配,将调用相应的视图函数
    5. 视图函数返回一个HttpResponse
    6. Django转换HttpResponse为一个适合的HTTP response, 以Web page显示出来
     
     
     

    URL匹配规则

    • 一旦匹配成功则不再继续
    • 若要从URL 中捕获一个值,只需要在它周围放置一对圆括号。
    • 不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles 而不是 ^/articles。
    • 每个正则表达式前面的'r' 是可选的但是建议加上。
     
    如:url(r'^hello/$', views.hello)
    • 如果尾部不是$的模式’^hello/’,那么任何以/hello/开头的URL将会匹配,例如:/hello/fo和/hello/bar
    • 如果忽略了尖号 "^",即’hello/$’,那么任何以hello/结尾的URL将会匹配,例如:/foo/bar/hello/。
    • 如果没有^开头和$结尾,那么任何包含hello/的URL将会匹配,如:/foo/hello/bar。
    • 因此,我们使用这两个符号以确保只有/hello/匹配,不多也不少。

     

    URL的常用的几种形式

    # 位置参数,  正则带括号,视图必须带参数   year_archive(request, 2009)
    url(r'^eee/([0-9]{4})/$', views.year_archive), 
    
    # 命名组 关键参数(GET)   year_archive(request, year=2009)
    url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive), 
    
    # 命名组 关键参数 (POST)  page(request, num=12)
    url(r'^blog/page(?P<num>[0-9]+)/$', views.page), 
    
    # 可选的第三个参数   page(request, num=12, foo=None)
    url(r'^blog/page(?P<num>[0-9]+)/$', views.page, {'foo': 'bar'},name='PAGE

    字符串URL

    from django.conf.urls import patterns, url, include
    
    urlpatterns
    = [ url(r'^time/', 'mysite.views.time'), ]

    URL分组

    from django.conf.urls import patterns, url, include
    
    #login
    urlpatterns = patterns('sblog.views',
        url(r'^login/$','login'),
        )
    
    #logout
    urlpatterns += patterns('sblog.views',
        url(r'^logout/$','logout'),
        )

    别名

    urlpatterns = [
    url(r'^$', 'news.views.index', name='index'),
    url(r'^aaa/(?P<name>[^/]+)/$', 'news.views.aa',name='AA'),
    url(r'^bbb/(?P<name>[^/]+)/$', 'news.views.bbb',name='BBB'),
    ]
     
    
    #在模板中使用
        不带参数: {% url "index" %}
        带参数: {% url "AA" www %} --- > /aaa/www
    
    
    # 在views或者models中使用
    >>> from django.core.urlresolvers import reverse # django 1.4-1.10
    >>> from django.urls import reverse   # django 1.10新加的,更加规范
    >>> reverse('BBB',args=('wwww',))
    '/bbb/wwww/
    >>> reverse('AA',args=('wwww',))
    '/aaa/wwww/'

    名称空间

    # mysite/urls.py
    url(r'^a/', include('blog.urls', namespace='author-polls',app_name='aaa')),
    
    # blog/url.py
    url(r'^(?P<pk>d+)/(?P<pw>d+)$', views.post_detail, name='detail'),
    
    
    在模板中使用: 
    {% url 'author-polls:detail' pk=12 pp=99 %}
    {% url 'aaa:detail' pk=12 pp=99 %}
    
    
    在views和models中使用
    In [3]: reverse('author-polls:detail', kwargs={'pk':1133,'pw':555})
    Out[3]: '/a/1133/555'
    In [4]: reverse('aaa:detail', kwargs={'pk':1133,'pw':555})
    Out[4]: '/a/1133/555'
  • 相关阅读:
    求一列的和,awk和perl哪个快?
    转:使用memc-nginx和srcache-nginx模块构建高效透明的缓存机制
    使用apt-get autoremove造成的系统无法开机
    因不公对待,技术销毁删除代码数据,谁对谁错?负能量文章,老板慎入。
    我曾经做过的插件
    宝石TD迷宫设计器
    VSX-5 VSXMusic 编码听音乐
    耐得住寂寞,才能守得住繁华
    VSX-4 VSXTra
    VSX-3 VSCT文件
  • 原文地址:https://www.cnblogs.com/hanqian/p/7029311.html
Copyright © 2020-2023  润新知