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/  做详细解说

  • 相关阅读:
    windows下 php-cgi.exe 0xc000007b 错误 阿星小栈
    call to undefined function openssl cipher iv length() 报错 PHP7开启OpenSSL扩展失败 阿星小栈
    PHP json_encode返回的json前端获取时出现unicode转码和反斜杠导致无法解析的解决办法
    Warring:POST Content-Length of 625523488 bytes exceeds the limit of 8388608 bytes in Unknown on line 0 阿星小栈
    PHP数组分割成新数组 阿星小栈
    Laravel ajax请求419错误及解决办法(CSRF验证) 阿星小栈
    MySQL said: Authentication plugin 'caching_sha2_password' cannot be loaded... 阿星小栈
    Laravel框架发送邮件 阿星小栈
    PHP 导出Excel三种方式 阿星小栈
    mysql命令 出现ERROR 1054 (42S22): Unknown column 'password' in 'field list'
  • 原文地址:https://www.cnblogs.com/zc3614/p/11682127.html
Copyright © 2011-2022 走看看