Third, the routing layer (the urls.py)

First, the route matches

1. URL第一个参数是正则表达式,一旦匹配到内容,会立刻结束匹配关系

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^test/$', views.test),
    ]


2. django路由匹配时,先不加斜杠匹配一次,如果匹配不上,则加斜杠再匹配一次,再匹配不上,就报错。取消自动加斜杠的功能,需要在settings中加上下面代码。

    APPEEND_SLASH = False


3. 路由匹配只匹配URL部分,不配‘?’后面get携带的参数

Second, famous and anonymous grouping grouping

1. 无名分组

    函数会将无名分组内正则表达式匹配到的内容当做位置参数传递给视图函数。
    
    a. 路由
    
        url(r'^test/(\d+)/', views.test)
    
    b. 后端

        def test(request, '正则表达式匹配到的内容')
                                        
                pass
        

2. 有名分组
    
    函数会将有名分组内正则表达式匹配到的内容当做关键字参数传递给视图函数。
    
    a. 路由
    
        url(r'^test/(?P<year>\d+)/', views.test)
    
    b. 后端

        def test(request, 'year')
                        
                pass
        
        
3. 同一匹配函数内无名分组和有名分组不能混合使用

Third, the reverse analysis

根据别名,动态解析出一个结果,该结果可以直接访问对应的URL。


1. 没有正则表达式的反向解析

    a. 路由
    
        url(r'^test/', views.test, name='xxx')
    
    b. 前端
    
        <ahref="{%url'xxx'%}">前端反向解析</a>
    
    c. 后端

        def get_url(request):
                url=reverse('xxx')
                print(url)
        
        
2. 无名分组的反向解析

    a. 路由
    
        url(r'^test/(\d+)/', views.test, name='xxx')
    
    
    b. 前端
        
        需要在前端手动指定正则匹配的内容,数字通常是数据的主键值。
        
        <ahref="{% url 'xxx' 123 %}">前端反向解析</a>
    
    
    c. 后端
        
        在args中以元组形式传入能被正则表达式匹配到的参数
    
        def get_url(request):
            url=reverse('xxx', args=(1,))
            print(url)


3. 有名分组的反向解析

    a. 路由
    
        url(r'^test/(?P<year>\d+)/', views.test, name='xxx')
    
    
    b. 前端
    
        # 简写
        <ahref="{% url'xxx' 19 %}">前端反向解析</a>
        
        # 规范写法
        <ahref="{% url 'xxx' year=19 %}">前端反向解析</a>
    
    
    c. 后端
        
        # 简写
        def get_url(request):
            url=reverse('xxx', args=(19,))
            print(url)
        
        # 规范写法
        def get_url(request):
            url=reverse('xxx', kwargs=('year': 19))
            print(url)
        
        

Fourth, route distribution

1. 路由分发过程

    1. 将所有的app手动建自己独立的urls.py、templates、static。

    2. 组长将所有人开发的app整合到一个空的django项目中。

    3. settings中注册app,总路由将请求转发给对应的app。
    
        
2. 总路由代码

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^app01/', include('app01.urls')),
        url(r'^app02/', include('app02.urls'))
    ]

V. namespace

当多个app中出现起别名冲突的情况,在做路由分发的时候,可以给每一个app创建一个名称空间,在反向解析时,能选择去哪个名称空间中查找别名。

起别名时统一加上应用名前缀即可避免使用名称空间。

1. 总路由

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^app01/', include('app01.urls', namespace='app01')),
        url(r'^app02/', include('app02.urls', namespace='app02'))
    ]


2. 后端

    def reg(request):
            print(reverse('app01:reg'))
            pass


3. 前端
        
    <ahref="{%url'app01:reg'%}"></a>
    <ahref="{%url'app02:reg'%}"></a>

Sixth, pseudo-static

1. 作用

    将一个动态网页伪装成一个静态网页,来提高搜索引擎查询频率。
    
2. 实现方法

    在路由后面以‘.html’结尾
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^test。html', views.test),
    ]
    

Seven different versions of the routing matches the difference django

1. django 1.x版本路由

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^test/', views.test),
    ]
    

2. django 2.x版本路由

    urlpatterns = [
        path('admin/', admin.site.urls),
        path('test/', views.test),
        re-path(r'^test/', views.test)
    ]
    

3. 区别

    django 2.x版本里面path第一个参数不支持正则表达式,写什么匹配什么,除非使用re-path。

VIII - Analytical reverse packet unknown sample

1. 路由

    url(r'^edit_user/(\d+)',views.edit_user,name='edit')

2. 前端

    {% for user_obj in user_list %}
    <a href="/edit_user/{{user_obj.id}}/">编辑</a>
    <ahref="{% url 'edit' user_obj.id %}">编辑</a>
    {% endfor %}
    
3. 后端

    defedit_user(request,edit_id):
    
            pass
    

Guess you like

Origin www.cnblogs.com/binyuanxiang/p/11992872.html