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)
  • 相关阅读:
    UVA 10600 ACM Contest and Blackout(次小生成树)
    UVA 10369
    UVA Live 6437 Power Plant 最小生成树
    UVA 1151 Buy or Build MST(最小生成树)
    UVA 1395 Slim Span 最小生成树
    POJ 1679 The Unique MST 次小生成树
    POJ 1789 Truck History 最小生成树
    POJ 1258 Agri-Net 最小生成树
    ubuntu 用法
    ubuntu 搭建ftp服务器,可以通过浏览器访问,filezilla上传文件等功能
  • 原文地址:https://www.cnblogs.com/xshan/p/8294896.html
Copyright © 2011-2022 走看看