zoukankan      html  css  js  c++  java
  • Django2.0中URL的路由机制

    Django2.0URL的路由机制

    路由是关联url及其处理函数关系的过程。Djangourl路由配置在settings.py文件中ROOT_URLCONF变量指定全局路由文件名称。

    Django的路由都写在urls.py文件中的urlpatterns列表中,由path()re_path()作为元素组成。

    DjangoURL路由流程:

    1  Django查找全局urlpatterns变量(urls.py

    按照先后顺序,对URL逐一匹配urlpatterns每个元素

    找到第一个匹配时停止查找,根据匹配结果执行对应的处理函数。

    如果没有找到匹配或出现异常,Django进行错误处理

    注意:

    Django的路由不考虑HTTP请求方式,仅根据URL进行路由,即,只要URL相同,无论POSTGET等哪种请求方式都指向同一个操作函数。

    Urlpatterns中的path()处理字符串路由,re_path处理正则表达式路由。

    其格式:

    urlpatterns=[

        path(routeviews.函数名,向处理函数提供的额外参数,以字典形式表示,该URL模式的别名),

    re_path(正则表达式,view.对应的处理函数)

    ]

    其中正则表达式可以看做字符串的模式。

    Django支持三种表达route

    1、       精确字符串格式:articles/2017/

    一个精确URL匹配一个操作函数;最简单的形式,适合对静态URL的响应;URL字符串不以“/”开头,但要以“/”结尾

    2、       Django的转换格式:<类型:变量名>,articles/<int:year>/

    是一个URL模版,匹配URL同时在其中获得一批变量作为参数;是一种常用形式,目的是通过URL进行参数获取和传递

    转换格式类型

    说明

    Str

    匹配除分隔符(/)外的非空字符,默认类型<year>等价于<str:year>

    Int

    匹配0和正整数

    Slug

    匹配字母、数字、横杠、下划线组成的字符串,str的子集

    Uuid

    匹配格式化的UUID,如075194d3-6885-417e-a8a8-6c931e272f00

    path

    匹配任何非空字符串,包括路径分隔符,是全集

     

    3、       正则表达式格式:articles/(?p<year>[0-9]{4})/

    借助正则表达式丰富语法表达一类URL(而不是一个);可以通过<>提取变量作为处理函数的参数,高级用法;使用该方法时,前面不能使用path()函数,必须使用re_path()函数;表达的全部是str格式,不能是其他类型。

    两种形式:不提取参数,比如re_path(articles/([0-9]{4}/,表示四位数字,每一个数字都是09的任意数字;提取参数,命名形式(?P<name>pattern,比如re_patharticles/(?P<year>[0-9]{4}/,将正则表达式提取的四位数字,每一个数字都是09的任意数字命名为year

    当视图函数路径较多时,可以使用Include()用法进行去重:

    urlpatterns=[
    
    path(‘<page_slug>-<page_id>/history/’,views.history),
    
    path(‘<page_slug>-<page_id>/edit/’,views.edit),
    
    ]

    等价于:

    Urlpatterns = [
    
    path(‘<page_slug>-<page_id>/’,include([
    
          path(‘history/’,views.history),
    
          path(‘edit/’,views.edit),
    
    ]

            当网站功能较多时可以在该功能文件夹里建一个urls.py文件,将该功能模块下的url全部写在该文件里。但是要在全局的urls.py中使用include方法实现url映射分发。

    例如:网站有论坛模块,则在论坛模块下建个urls.py文件,将与论坛相关的页面的url全部写在这个文件里,然后在全局的urls.py文件里这样写:

    from django.urls import path,include
    
    urlpatterns = [
    
        path('admin/', admin.site.urls),
        path('ant_test/',include('ant_test.urls'))
    ]

         在论坛模块下的urls.py文件这样写:

    from django.urls import path
    urlpatterns = [
    
        path('news/',views.news),
    
       ]

           在views.py中写对应的news函数即可。

      Django2.0版本中path(route,views.对应处理函数)等价于低版本的url(r'^route/$’,views.对应处理函数)

      url的应用命名空间:

      在多个app之间,有可能产生同名的url。这时候为了避免反转url时产生混淆,可以使用应用命名空间,来区分。
      定义应用命名空间只要在‘app’的'urls.py'中定义一个叫做;'app_name'的变量,来指定这个应用的命名空间即可。实例代码如下:

    app_name = 'app01'
    
    urlpatterns = [
        path('login/',views.login,name='login'),
    ]

      以后在做反转的时候可以使用:'应用命名空间:url名称'的方式进行反转。实例代码如下:

    from django.shortcuts import redirect, reverse
    def login(request):
        login_url = reverse('app01:login')
        # 跳转登录页面
        return redirect(login_url)
  • 相关阅读:
    怎么选取训练神经网络时的Batch size?
    一个batch的数据如何做反向传播
    Chinese NER Using Lattice LSTM-阅读总结
    深度学习Inception
    非极大值抑制--NMS
    CUDA简要理解
    Anaconda+tensorflow+pyTorch安装
    多层神经网络python实现
    深入解析Jieba分词源码(包括Trie存储,正向匹配,HMM,viterbi)
    最小堆排序MinHeap
  • 原文地址:https://www.cnblogs.com/xshan/p/8294896.html
Copyright © 2011-2022 走看看