zoukankan      html  css  js  c++  java
  • django系列3.1--url路由配置, 正则, 分发include, 分组命名匹配

    一.url配置

      在django项目中urls.py文件中就是为这个url调用的view(视图)函数之间的映射表,来配置访问的一个url执行什么代码

    默认的基本格式:

    from django.conf.urls import url
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
    ]

      循环urlpatterns,找到对应的函数执行,匹配上一个路径就找到对应的函数执行,就不再往下循环了,并给函数传一个参数request,和wsgiref的environ类似,就是请求信息的所有内容

    url()中包含:

    1. 正则表达式字符串
    2. views视图函数,如果用到分发时,注意引包
    3. 要传给视图函数的默认参数(字典格式)
    4. 别名,一个可选的name参数

    在django 2.0版本中替换成了如下写法,但是依然向下兼容1.x的写法,注意正则部分少写了r

    from django.urls import path
    
    urlpatterns = [
        path('articles/', views.func),
        path('articles/<int:year>/<int:month>/', views.month_archive),
    ]

    二.url中的正则

    1.简单的正则规则

            ^    字符串开头
            $    字符串结尾
            d    数字
            s    任意的空白符
            w    字母数字下划线
            
            {n}    重复n次
            {n,m} 重复n到m次
            
            .    匹配除换行符以外的任意字符
            *    重复0次或多次    
            ?    重复0次或1次
            +    重复1次或更多次    
    1. urlpatterns中的元素按照书写顺序从上往下逐一匹配正则表达式,一旦匹配成功则不再继续。
    2. 若要从URL中捕获一个值,只需要在它周围放置一对圆括号(分组匹配)。
    3. 不需要添加一个前导的反斜杠(也就是写在正则最前面的那个/),因为每个URL 都有。例如,应该是^articles 而不是 ^/articles。
    4. 每个正则表达式前面的'r' 是可选的但是建议加上。
    5. ^articles&  以什么结尾,以什么开头,严格限制路径
    6. 如果要用路径直接访问 应该为 ^$ 这样写

     

    2.访问根目录的方法

        url(r'^$',views.admin)

    3.是否开启URL访问地址后自动跳转带有 /  的配置项

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

      

      Django settings.py配置文件中默认没有 APPEND_SLASH 这个参数,但 Django 默认这个参数为 APPEND_SLASH = True。 其作用就是自动在网址结尾加'/'。其效果就是:我们定义了urls.py:

    from django.conf.urls import url
    from app import views
    
    urlpatterns = [
            url(r'^blog/$', views.blog),
    ]

      若我们请求的网址是http://www.example.com/

      那么在settings.py中设置了 APPEND_SLASH=False,此时我们再请求 http://www.example.com 时就会提示找不到页面。

    三.分组的命名匹配

       如果把所有app的url都写在一个文件中,不容易维护,所以我们在每个app内部都写有它自己的url,通过总的urls文件进行分发,在Python的正则表达式中,分组命名正则表达式组的语法是(?P<name>pattern),其中name是组的名称,pattern是要匹配的模式。注意从url中匹配的都是字符串

    分组

      位置参数传参:

      url(r'^index/(d{2})/(d{2})/', views.index), index函数里面要写对应的形参来接收

      urls.py

    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    
    urlpatterns = [
      url(r'^blog/(d{4})/[1-9]{2}', views.blog),
    ]

      views.py

    from django.shortcuts import render, HttpResponse, redirect
    # Create your views here.
    
    def blog(request,m,n):
      return HttpResponse('blog')

    命名分组:

      关键字参数传参,函数里面的参数接收必须和url里的关键字一样: url(r'^index/(?P<year>d{2})/(?P<month>d{2})/', views.index), index(request,year,month)

      urls.py

    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    urlpatterns = [
      url(r'^blog/(?P<url>d{4})/[1-9]{2}', views.blog),
    ]

      views.py

    def blog(request, url):
      print(url)
      return HttpResponse('blog')

    从视图函数中指定默认值

    # urls.py中
    from django.conf.urls import url
    from . import views
    urlpatterns = [
      url(r'^blog/$', views.page),
      url(r'^blog/page(?P<num>[0-9]+)/$', views.page),
    ]
    # views.py中,可以为num指定默认值
    def page(request, num="1"):
      pass

      两个URL模式指向相同的view - views.page - 但是第一个模式并没有从URL中捕获任何东西。如果第一个模式匹配上了,page()函数将使用其默认参数num=“1”,如果第二个模式匹配,page()将使用正则表达式捕获到的num值。

    五.URL分发

      include(其他urls.py文件)

    URL分发其他的URLconfs(include):

      把每个应用自己的urls分发给了各自的应用里面的urls.py文件中,下面的代码是写在项目下的urls.py(和setting同级的目录中那个)

    from django.conf.urls import include, url
    urlpatterns = [
     url(r'^admin/', admin.site.urls),
     url(r'^app01/', include('app01.urls')), 
    ]
    # 这里的app01是代表app,而app01.urls就是说app01下的urls.py(自己建)
    我们在app01下的urls.py写自己的url即可

       app01中的urls.py文件

    from django.conf.urls import include,url
    from . import views
            
    urlpatterns = [
        url(r"^index/",views.index),
    ]

      这样写的访问路径为 http://127.0.0.1:8000/app01/index/

    六.传递额外的参数给视图函数

      URLconfs 具有一个钩子,让你传递一个Python 字典作为额外的参数传递给视图函数。

      django.conf.urls.url() 可以接收一个可选的第三个参数,它是一个字典,表示想要传递给视图函数的额外关键字参数。

    urls.py

    from django.conf.urls import url
    from . import views
    
    urlpatterns = [
      url(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive, {'foo': 'bar'}),
    ]

    views.py 函数中必须要有关键字参数

    def year(request,year,foo):
      pass

      在这个例子中,对于 /blog/2005/ 请求,Django 将调用 views.year_archive(request, year='2005',foo='bar') 。 当传递额外参数的字典中的参数和URL中捕获值的命名关键字参数同名时,函数调用时将使用的是字典中的参数,而不是URL中捕获的参数

      不要将urls.py文件直接拖进去复制, 否则setting里就会将 ROOT_URLCONF = 'login.urls' 改变,导致app下的url成为根url

  • 相关阅读:
    个人冲刺二(7)
    个人冲刺二(6)
    个人冲刺二(5)
    个人冲刺二(4)
    对称二叉树 · symmetric binary tree
    108 Convert Sorted Array to Binary Search Tree数组变成高度平衡的二叉树
    530.Minimum Absolute Difference in BST 二叉搜索树中的最小差的绝对值
    pp 集成工程师 mism师兄问一问
    17. Merge Two Binary Trees 融合二叉树
    270. Closest Binary Search Tree Value 二叉搜索树中,距离目标值最近的节点
  • 原文地址:https://www.cnblogs.com/robertx/p/10426952.html
Copyright © 2011-2022 走看看