zoukankan      html  css  js  c++  java
  • django之路由

    路由是指当请求来后,一种请求对应一种函数的那个urls.py配置文件中的映射关系

    1. urlpatterns中的元素按照书写顺序从上往下逐一匹配正则表达式,一旦匹配成功则不再继续。

    2.当浏览器访问请求的url不是以/结尾时,jango会自动给该请求加/结尾,并让浏览器重新访问.可设置

      为不主动加结尾处的/,方法:settings.py文件中加入APPEND_SLASH=False即可,配置文件中虽然没

     有这个参数,但默认结果是True;当配置完成后url请求后不加/时是访问不到页面的.(了解即可)

    3. URLconf匹配的位置: URLconf 在请求的URL 上查找,将它当做一个普通的Python 字符串,会取

         网址之后?号之前的字符串来做正则匹配. 且匹配出来的所有东西都是字符串形式.

    .  分组命名匹配:

        1. url(r'^articles/([0-9]{4})/$', views.func) 普通分组形式

          以上路由中,通过对正则加分组,可以把分组内捕获的内容以参数形式传给func函数,通过这

      个原理我们可以不用再使用?id=’xx’的形式来传数据了,可用正则分组来实现,只需在href处拼

      接好结构即可. 是以位置参数的形式直接传给视图函数的.

        2.  url(r'^articles/(?P<name>[0-9]{4})/$', views.func)  分组命名形式

             在更高级的用法中,可以使用分组命名匹配的正则表达式组来捕获URL中的值并以关键

       字参数形式传递给视图。在Python的正则表达式中,分组命名正则表达式组的语法是

             (?P<name>pattern),其中name是组的名称, pattern代表匹配的正则表达式; 这个是以

       关键字参数的形式直接传值给视图函数的,所以要求视图函数的形参名字不能随便起.

    补充: 上面12是两种给视图函数传参的方式,还有第3中方式,了解即可:

           url(r'^articles/(?P<name>[0-9]{4})/$', views.func, {‘name’:’20’})

           如上:在后面再加入个字典,当字典的key和分组命名的名字重复时,系统优先使用字典key

           对应的value, 当两个不冲突时,都会使用. 视图函数形参处为*args**kwargs

        3. 视图函数中指定默认值,代码如下:

            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访问请求不含数字时,默认返回第一页内容,当请求包含数字时,会动态的替换调num

          的值,从而达到返回指定页面的目的.

    . 路由的分发:

       1. 思路: 把本该在项目目录下的urls.py中进行路由匹配的功能给分发到每个包内,在包内新建

                    urls.py文件来进行路由匹配;在项目目录下的urls.py中建立分发指引路径即可.

       2. 现有app名为app01,做法如下:

          首先在项目目录的urls.py中导入  from django.conf.urls import  include

          然后配置  urlpatterns = [

                         url(r'^app01/', include('app01.urls')),  ]    # 路由分发至app01中    

          注意分发完成后再访问时url前面就多了app01,所有页面内引用到url地方都要改

    . 命名URLURL反向解析

         1.urls.py路由中指定别名

         2.views.py视图文件中导入from django.shortcuts import render, redirect, reverse

         3.也可从这里导入:from django.urls import  reverse

     命名URL:

      普通命名 url(r'^class/$', views.class, name=’cla’ )

          分组命名 url(r'^class/([0-9]{4})/([0-9]{2})/$', views.class, name=’cla’ )

          命名分组 url(r'^class/(?P<x>[0-9]{4})/(?P<y>[0-9]{2})/$', views.class, name=’cla’ )

      URL反向解析:

         在视图函数中的语法:  views.py中导入from django.urls import  reverse

          普通: redirect( reverse(‘cla’) )  # 会动态的感知cla对应的url中正则的变化,并体现出来

          分组: redirect( reverse(‘cla’ , args=(‘6666’, ’88’) ) )  # 有参正则给的参数要符合正则规则

          命名: redirect( reverse(‘cla’ , kwargs={ ‘x’:‘6666’, ’y’: ’88’} ) )  # 同上

        html模板中的语法:

          普通: {% url ‘cla’ %}  # url 后跟别名即可,会动态感知并替换

          分组: {% url ‘cla’ ‘6666’ ‘88’ %}  # 原理同上视图中

          命名: {% url ‘cla’ x=‘6666’ y=‘88’ %}

    . 项目中存在多个包,且包内别名有重复时:

          以下是项目目录下的主路由语法, 其中namespace是固定写法,不可变

           url(r'app02/', include('app02.urls',namespace='app02')),

           url(r'app01/',include('app01.urls',namespace='app01')),

      以下是views.py中函数视图内的语法:

           reverse('app01:home',kwargs={'year':'2018','month':'10'})

           reverse('app02:home',kwargs={'year':'2018','month':'10'})

     以下是html页面中的语法:

           {% url 'app02:home' '2018' '10'  %}

  • 相关阅读:
    Python staticmethod
    pandas通过字典生成dataframe
    关于series的统计
    python的*args与**kwargs
    python global
    matplotlib画子图时设置总标题
    matplotlib两种画散点图的方式
    idea下web工程的编译和输出设置
    Vue&webpack入门实践
    《图解设计模式》读书笔记6-1 VISITOR模式
  • 原文地址:https://www.cnblogs.com/quzq/p/9776135.html
Copyright © 2011-2022 走看看