zoukankan      html  css  js  c++  java
  • Django URL路由分发系统

    Django  URL路由分发系统

    URL匹配过程

    在Django中,我们使用urls.py模块处理url的分发

    例:http://127.0.0.1:8080/abindex?a=1

    1)去除域名和端口以及 /,剩下 abindex?a=1

    2)拿 abindex?a=1 先到项目的 url.py 去匹配,然后拿剩下的index再到应用下面的urls.py去匹配

    3)如果匹配成功,则调用相应的视图函数产生的内容返回给客户端。匹配失败的话则返回404错误。

    from django.conf.urls import url   #此处是项目下的urls.py
    from blog import views
    
    # url( path路径,views视图函数,反向解析)
    urlpatterns = [
        url(r'admin/', admin.site.urls),     #django后台admin
        url(r'^ab/', include('blog.urls')),   #匹配到ab所指的blog应用下的urls.py再去匹配,此时用include函数指定位置
        url(r'login1/',views.login,name='login')#若是从项目目录直接指向应用的views的话,在匹配 path路径 后,views视图函数直接写views.函数名  
                                name= 为反向解析(例路径 login1所指向的反向解析为 login所对应的视图函数为views.login,所以,login1可以更换为其他地址,方便后期更改url,而不用重新更改视图函数和模版变量里的url)
    ]

    一般来说,一个项目不止一个应用,所以,我们需要将分类,将不同的url分配到不同的应用中再做匹配,然后再执行views视图函数

    from django.conf.urls import url   #此处是项目下的urls.py
    from blog import views
    
    # url( path路径,views视图函数,反向解析)
    urlpatterns = [
        url(r'admin/', admin.site.urls),     #django后台admin
        url(r'^bss/', include('blog.urls')),   #匹配到bss所指的bss应用下的urls.py再去匹配,此时用include函数指定位置
        url(r'^web/', include('blog.urls')),   #匹配到web所指的web应用下的urls.py再去匹配,此时用include函数指定位置
        url(r'^vedio/', include('blog.urls')),   #匹配到vedio所指的vedio应用下的vedio.py再去匹配,此时用include函数指定位置
    
    ]

    URL参数捕获

    现在,我们通过include把项目中的url定位到我们应用来了,此时我们再从应用中匹配执行视图函数,并捕获url后面的参数

    例:http://127.0.0.1:8080/bss/login/abc/2019

    from django.conf.urls import url   #此处是应用bss下的urls.py
    from django.urls import path,re_path
    from bss import views
    
    urlpatterns = [
       path(r'^login/<str:name>/<int:num>',views.login),              #此时先过项目的匹配,筛选掉了bss,然后剩余部分再匹配login ,剩下abc/2019,分别被name和num捕获到
       re_path(r'login/(?P<name>w+)/(?P<years>[0-9]{4})', views.test),   # 通过函数re_path或者下面url函数 自定义固定参数捕获 name 和 num 参数,此方法叫关键字参数捕获
       url(r'login/(?P<name>w+)/(?P<years>[0-9]{4})', views.test),     # 也可以通过函数url函数达到同样目的
       url(r'login/(w+)/(d+)', views.test),                   # 也可以通过函数url函数达到同样目的,此方法叫位置参数捕获
     ] 

    关键字参数捕获到的name和num在views.py中应在函数定义的时候作为参数传入,且参数变量名必须保持一致。

    而位置参数捕获,因为只是在匹配地址时位置分组,所以变量名可自定义,使用时按照位置给变量取名。

    def login(request,name,num)
        pass

    此时,url   path  re_path   三个函数可能会混淆

    简单说   django 1.X 版本用url

        django 2.X 版本用 re_path  path(不能正则匹配,只能分发)

    可查看: https://www.bbsmax.com/A/D8546ZRQzE/  做详细解说

  • 相关阅读:
    nowcoderD Xieldy And His Password
    Codeforces681D Gifts by the List
    nowcoder80D applese的生日
    Codeforces961E Tufurama
    Codeforces957 Mahmoud and Ehab and yet another xor task
    nowcoder82E 无向图中的最短距离
    nowcoder82B 区间的连续段
    Codeforces903E Swapping Characters
    Codeforces614C Peter and Snow Blower
    Codeforces614D Skills
  • 原文地址:https://www.cnblogs.com/zc3614/p/11682127.html
Copyright © 2011-2022 走看看