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

    URL

    1、URL的作用

      URL配置(URLconf)就像Django所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表。我们就是以这种方式告诉Django,遇到哪个URL的时候,要对应执行哪个函数。

    2、基本格式

    # Django 2.0之前的版本的写法
    from django.conf.urls import url
    
    urlpatterns = [
         url(正则表达式, views视图,参数,别名),
    ]
    
    
    # Django 2.0 版本及之后的写法                                                
    from django.urls import path,re_path
    
    urlpatterns = [
        path('articles/2003/', views.special_case_2003),
        path('articles/<int:year>/', views.year_archive),
        path('articles/<int:year>/<int:month>/', views.month_archive),
        path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
    ]    

    3、参数说明

    • 正则表达式:一个正则表达式字符串
    • views视图:一个可调用对象,通常为一个视图函数
    • 参数:可选的要传递给视图函数的默认参数(字典形式)
    • 别名:一个可选的name参数

    4、基本配置

    from django.conf.urls import url
    from . import views
    
    urlpatterns
    = [ url(r'^articles/2003/$', views.special_case_2003), url(r'^articles/([0-9]{4})/$', views.year_archive), url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive), url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail), ]

    5、注意事项

    1、urlpatterns中的元素按照书写顺序从上往下逐一匹配正则表达式,一旦匹配成功则不再继续。
    2、若要从URL中捕获一个值,只需要在它周围放置一对圆括号(分组匹配)。
    3、不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles 而不是 ^/articles。
    3、每个正则表达式前面的'r' 是可选的但是建议加上。

    6、补充说明

    # 是否开启URL访问地址后面不为/跳转至带有/的路径的配置项
    APPEND_SLASH=True

    举例:

    默认开启:浏览器输入:http://127.0.0.1/index,最后转化为http://127.0.0.1/index/

    设置为False:路劲后面不加斜杠,输入什么匹配什么。

    普通传参方式

    例:浏览器输入http://127.0.0.1:8000/group/?pk=10,后台获取并填充到html页面返回

    urls.py

    urlpatterns = [
        url(r'^group/$', views.group)
    ]

    views.py

    def group(request):
        pk = request.GET.get('pk')
        return render(request,'group.html',{"pk":pk})

    html文件

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="x-ua-compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Title</title>
    </head>
    <body>
    <div>{{ pk }}</div>
    </body>
    </html>

    结果:

    分组匹配传参

    实质:按位置传参给视图函数

    注意:url中捕获的参数,其参数类型永远为字符串类型。

    例:浏览器访问并传入一个参数,分组方式进行捕获,并将捕获的参数填充到html页面中返回

    urls.py文件

    from django.conf.urls import url
    urlpatterns = [
        url(r'^group/(d+)', views.group)
    ]

    views.py文件

    def group(request, pk):
        return render(request,'group.html',{"pk":pk})

    group.html文件

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="x-ua-compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Title</title>
    </head>
    <body>
    <div>{{ pk }}</div> 
    </body>
    </html>

    浏览器输入:http://127.0.0.1:8000/group/10

    返回页面

     命名分组传参

    实质:按关键字传参给视图函数

    urls.py

    urlpatterns = [
        url(r'^group/(?P<name>w+)$', views.group)
    ]

    views.py

    def group(request,name):
        return render(request,'group.html',{"name":name})

    html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="x-ua-compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Title</title>
    </head>
    <body>
    <div>{{ name }}</div>
    </body>
    </html>

    浏览器输入:http://127.0.0.1:8000/group/laowang

    结果:

     反向解析

    1、理解:简单来说就是可以给我们的URL匹配规则起个名字,一个URL匹配模式起一个名字。这样我们以后就不需要写死URL代码了,只需要通过名字来调用当前的URL。

    2、前提:url规则后面设定那么属性

      如:

    url(r'^group/(?P<name>w+)$', views.group,name='group')

    3、应用

    • 在模板中:使用url模板标签。
    • 在Python 代码中:使用django.core.urlresolvers.reverse() 函数。
    • 在更高层的与处理Django 模型实例相关的代码中:使用get_absolute_url() 方法。

      注意:redirect()方法源码中使用了reverse()方法,所以可以直接在redirect()中使用反向解析名称。

    4、例句:

      在模板中的应用

    <a href="{% url 'index' %}">首页</a>

      

       在视图函数中的应用

    def group(request, name):
        return redirect('index') # 或者 redirect(reverse('index'))

    名称空间

     即使不同的APP使用相同的URL名称,URL的命名空间模式也可以让你唯一反转命名的URL。即:为不同app中的url加上app标识,便于系统找到准确的url

    注意:settings文件中的ROOT_URLCONF参数配置,它指向Django项目的首先访问的名称空间,也可称为总空间,其他名称空间属于该空间的一部分子空间。 

    settings.py文件
      ...
    ROOT_URLCONF = 'CRM.urls'
      ...

    总空间urls.py

    from django.conf.urls import url, include
     
    urlpatterns = [
        url(r'^app01/', include('app01.urls', namespace='app01')),
        url(r'^app02/', include('app02.urls', namespace='app02')),
    ]

    app01中的urls.py

    from django.conf.urls import url
    from app01 import views
     
    app_name = 'app01'
    urlpatterns = [
        url(r'^(?P<pk>d+)/$', views.detail, name='detail')
    ]

    app02中的urls.py

    from django.conf.urls import url
    from app02 import views
     
    app_name = 'app02'
    urlpatterns = [
        url(r'^(?P<pk>d+)/$', views.detail, name='detail')
    ]

    上述两个app中的url重复,如何找到我们想要的url呢?(根据namespace配置)

    模板中的使用:

    {% url 'app01:detail' pk=12 pp=99 %}

    views中的函数中使用

    v = reverse('app01:detail', kwargs={'pk':11}) # 注意:kwargs针对命名分组

    名称空间下的反向解析及传参(综合)

    1、url分发

    url(r'正则',include('app01.urls',namespance='app01'))

    2、URL反向解析

    # 静态路由
    url(r'正则',views.func,name='func') # urls.py <a href="{% url 'app01:func' %}"></a>   # 模板 return redirect(reverse('app01:func')) # 视图函数中
    # 分组
    url(r
    'login/(d+)',views.func,name='func') <a href="{% url 'app01:func' pk %}"></a> return redirect(reverse('app01:func',args=(pk,)))
    # 命名分组 url(r
    'login/(?P<pk>d+)',views.func,name='func') <a href="{% url 'app01:func' pk=pk %}"></a> return redirect(reverse('app01:func',kwargs={'pk':pk}))
  • 相关阅读:
    Node Js
    动态遍历接收的参数
    负载均衡和springcloud.Ribbon
    Spring Cloud
    springboot整合hibernate
    python模块知识总结
    什么是netty--通俗易懂
    IDEA 的操作与使用
    spring 整合guava
    log4j向指定文件输出日志
  • 原文地址:https://www.cnblogs.com/kindvampire/p/12297641.html
Copyright © 2011-2022 走看看