django-url调度器-高级篇

  我们在中级篇中学会了如何进行反向解析,但是有这样一个问题,在为 url 命名的时候,名字不能重复,否则会导致各种各样的问题。在 url 还少的时候保证不重名还是比较简单的,但是 url 多起来以后就比较难了。为了解决这样的问题,可以在 url 中加一个前缀。例如,我有一个 url 的名字叫做 ‘comment‘ ,此时,我可以为其加一个前缀,这个前缀通常是 app 名,例如:‘myapp-comment‘。

  这也是django所推荐的命名方式,但是这样始终是治标不治本。此时,我们就要学习 django 中 url 命名空间了。

URL 命名空间

  简介:

  URL 命名空间允许你反查到唯一的命名 URL,即使在不同的应用中使用相同的 URL 名称。(也就是可以在不同的app中使用相同的名称,为有命名困难症的程序员带来了福音)

  根据经验,第三方应用应该始终使用带命名空间的URL 。类似地,它还允许你在一个应用有多个实例部署的情况下反查URL。换句话讲,因为一个应用的多个实例共享相同的命名URL,命名空间将提供一种区分这些命名 URL 的方法。

  在一个站点上,正确使用 URL 命名空间的 Django 应用可以部署多次。例如,django.contrib.admin 具有一个 AdminSite 类,它允许你很容易地部署多个管理站点的实例。在下面的例子中,我们将讨论在两个不同的地方部署教程中的polls 应用,这样我们可以为两种不同的用户(作者和发布者)提供相同的功能。

一个URL 命名空间有两个部分,它们都是字符串

 应用命名空间
  它表示正在部署的应用的名称。一个应用的每个实例具有相同的应用命名空间。例如,可以预见Django 的管理站点的应用命名空间是‘admin‘。
 实例命名空间
  它表示应用的一个特定的实例。实例的命名空间在你的全部项目中应该是唯一的。但是,一个实例的命名空间可以和应用的命名空间相同。它用于表示一个应用的默认实例。例如,Django 管理站点实例具有一个默认的实例命名空间‘admin‘

  URL 的命名空间使用‘:‘ 操作符指定。例如,管理站点应用的主页使用‘admin:index‘。它表示‘admin‘ 的一个命名空间和‘index‘ 的一个命名URL。

  命名空间也可以嵌套。命名URL‘sports:polls:index‘ 将在命名空间‘polls‘中查找‘index‘,而poll 定义在顶层的命名空间‘sports‘ 中。


反查带命名空间的URL

  我们在中级篇中了解到了 url 反查带来的变量,而在中级篇中,都是使用 name 进行反查,这里来看看如何对带命名空间的 url 进行反查。

例子:

from django.conf.urls import include, url

urlpatterns = [
    url(r‘^author-polls/‘, include(‘polls.urls‘, namespace=‘author-polls‘, app_name=‘polls‘)),
    url(r‘^publisher-polls/‘, include(‘polls.urls‘, namespace=‘publisher-polls‘, app_name=‘polls‘)),
]
from django.conf.urls import url

from . import views

urlpatterns = [
    url(r‘^$‘, views.IndexView.as_view(), name=‘index‘),
    url(r‘^(?P<pk>\d+)/$‘, views.DetailView.as_view(), name=‘detail‘),
    ...
]

 反查的方法和中级篇的一样,在模板中:

{% url ‘polls:index‘ %}

 在基于类的视图的方法中:

reverse(‘polls:index‘, current_app=self.request.resolver_match.namespace)

 另外,注意,在模板中的反查需要添加 requestcurrent_app 属性,像这样:

def render_to_response(self, context, **response_kwargs):
    self.request.current_app = self.request.resolver_match.namespace
    return super(DetailView, self).render_to_response(context, **response_kwargs)

 这时,会有同学有疑问了, polls 这个应用命名空间设置了两行呀,那 polls 下的 index 到底指的是哪个?

 这个时候,就要看 django 的查找顺序了:

 1.如果当前有实例,也就是说我们通过 url 访问到了某个处理函数,这个函数进行反向查询的时候,例如我访问的是:author-polls/ ,这个 url 对应的处理函数要进行反向解析,此时它要解析 ‘polls:detail‘。那么将解析到 author-polls/(?P<pk>\d+)/$ 中,也就是有实例的优先在该实例空间中查询。

 2.如果没有实例,但是有默认的实例空间,例如 app_name=‘polls‘,namespace=‘polls‘ ,和应用空间同名,这样的就叫做默认实例空间。在没有访问实例的时候,就匹配到默认实例空间中。

 3.如果没有实例,也没有默认实例空间,那么谁是最后注册的就选谁,例子中的 namespace=‘publisher-polls‘ 就是最后一个注册的(也就是下面的)。

注意:

  因为实例空间要是唯一的,所以使用 namespace:name 的模式应该也是唯一匹配的,例如这里的‘author-polls:index‘ 将永远解析到 ‘author-polls‘ 实例的主页(‘publisher-polls‘ 类似)。


URL 命名空间和被包含的URLconf

  被包含的URLconf 的命名空间可以通过两种方式指定。

  首先,在你构造你的URL 模式时,你可以提供 应用 和 实例的命名空间给 include() 作为参数。例如

url(r‘^polls/‘, include(‘polls.urls‘, namespace=‘author-polls‘, app_name=‘polls‘)),

  这将包含 polls.urls 中定义的URL 到应用命名空间 ‘polls‘中,其实例命名空间为‘author-polls‘

  其次,你可以include 一个包含嵌套命名空间数据的对象。如果你include() 一个url() 实例的列表,那么该对象中包含的URL 将添加到全局命名空间。然而,你还可以include() 一个3个元素的元组:

(<list of url() instances>, <application namespace>, <instance namespace>)

  注意这里的应用命名空间和实例命名空间是相反的。

  实例:

from django.conf.urls import include, url

from . import views

polls_patterns = [
    url(r‘^$‘, views.IndexView.as_view(), name=‘index‘),
    url(r‘^(?P<pk>\d+)/$‘, views.DetailView.as_view(), name=‘detail‘),
]

url(r‘^polls/‘, include((polls_patterns, ‘polls‘, ‘author-polls‘))),

  这样会包含命名的URL模式进入到给定的应用和实例命名空间中。



这里来总结几个关键函数的用法:

1. include(arg, namespace=None, app_name=None)

  arg:可以接受一个字符串,表示被包含的模块在哪里;也可以接受一个列表,这个列表是被包含的 url() 的实例;还可以接受一个元祖,元祖的第一个元素是一个被包含的列表,第二个元素是该列表的应用空间名,第三个元素是实例空间名。

  namespace : 实例命名空间

  app_name : 应用命名空间

2. url(regex, view, kwargs=None, name=None, prefix=‘‘)

  regex:要匹配的 url。

   view:该 url 的处理函数,可以是一个表示函数位置的字符串, 也可以是一个函数的实例。

   kwargs: 一个字典,表示传递多余的参数。

   name : 为 url 进行命名。

   prefix : if prefix: view = prefix + ‘.‘ + view  表示在 view 前加上前缀。

时间: 2024-12-23 20:36:23

django-url调度器-高级篇的相关文章

django-url调度器-中级篇

在初级篇中,我们接触了: 1.url 的简单编写 2.两种传参的方式 3.捕获的参数总是字符串 4.为视图设置默认参数 …… 在中级篇中将更进一步. 包含其它的URLconfs 当网站非常大的时候,将所有的url都写在一个url模块中会非常的臃肿,且后期不便于维护.此时,就可以使用包含的方式将部分的url放在另一个url模块中.最常见的就是每个app的url都进行分离. 官方代码示例: from django.conf.urls import include, url urlpatterns =

django-url调度器-初级篇

Django 遵从 MVC 模型,并将其特色化为 MTV 模型.模型的核心是通过用户访问的 url 来指向处理的函数,而函数处理后返回相应的结果.所以url决定了用户访问的入口,另外表单处理的提交地址也需要指定的url.url是所有功能的入口,所以url的编写就变得非常重要. Django 的 url 编写涉及了 python 的 re 模块,也就是正则表达式,这部分内容需要提前掌握. 本篇的内容将结合官方的1.8.2的文档进行说明,如果有说明不清的地方可以相应参照官方的文档,我这里提供一个进行

django url调度

Django的url配置同样遵循着DRY(dont repeat yourself)的规则.以下都是官方文档的例子: 首先介绍的是Django如何处理http的请求: 1.在setting里定义ROOT_URLCONF ,这个值就是url的根配置,但若被request processing中间件定义了HttpRequest的urlconf属性,会替换掉ROOT_URLCONF 2.Django 加载模块,寻找 urlpatterns,它是pattern函数的返回值,是url的list 3.寻找每

FreeRTOS高级篇3---启动调度器

使用FreeRTOS,一个最基本的程序架构如下所示: int main(void) { 必要的初始化工作; 创建任务1; 创建任务2; ... vTaskStartScheduler(); /*启动调度器*/ while(1); } 任务创建完成后,静态变量指针pxCurrentTCB(见<FreeRTOS高级篇2---FreeRTOS任务创建分析>第7节内容)指向优先级最高的就绪任务.但此时任务并不能运行,因为接下来还有关键的一步:启动FreeRTOS调度器. 调度器是FreeRTOS操作系

Django Rest Framework url注册器组件 | 响应器组件 | 分页器组件

文章参考博主:https://www.cnblogs.com/li-li/p/10103918.html 1.url注册器组件 : 通过DRF的视图组件,数据接口逻辑被我们优化到最后剩下一个类,接下来,我们使用DRF的url控制器来帮助我们自动生成url '''3.使用url注册器组件的url''' #导入模块 from rest_framework import routers router = routers.DefaultRouter() # 3.将需要自动生成url的接口注册到route

Django学习【第1篇】:Django之MTV模型

Django框架第一篇基础 一个小问题: 什么是根目录:就是没有路径,只有域名..url(r'^$') 补充一张关于wsgiref模块的图片 一.MTV模型 Django的MTV分别代表: Model(模型):和数据库相关的,负责业务对象与数据库的对象(ORM) Template(模板):放所有的html文件 模板语法:目的是将白变量(数据库的内容)如何巧妙的嵌入到html页面中 View(视图):负责业务逻辑,并在适当的时候调用Model和Template 此外,Django还有一个URL分发

FreeRTOS高级篇8---FreeRTOS任务通知分析

在FreeRTOS版本V8.2.0中推出了全新的功能:任务通知.在大多数情况下,任务通知可以替代二进制信号量.计数信号量.事件组,可以替代数长度为1的队列(可以保存一个32位整数或指针值),并且任务通知速度更快.使用的RAM更少!我在< FreeRTOS系列第14篇---FreeRTOS任务通知>一文中介绍了任务通知如何使用以及局限性,今天我们将分析任务通知的实现源码,看一下任务通知是如何做到效率与RAM消耗双赢的.        在<FreeRTOS高级篇6---FreeRTOS信号量

FreeRTOS高级篇5---FreeRTOS队列分析

FreeRTOS提供了多种任务间通讯方式,包括: 任务通知(版本V8.2以及以上版本) 队列 二进制信号量 计数信号量 互斥量 递归互斥量 其中,二进制信号量.计数信号量.互斥量和递归互斥量都是使用队列来实现的,因此掌握队列的运行机制,是很有必要的.      队列是FreeRTOS主要的任务间通讯方式.可以在任务与任务间.中断和任务间传送信息.发送到队列的消息是通过拷贝实现的,这意味着队列存储的数据是原数据,而不是原数据的引用.先看一下队列的数据结构: typedef struct Queue

FreeRTOS高级篇2---FreeRTOS任务创建分析

在FreeRTOS基础系列<FreeRTOS系列第10篇---FreeRTOS任务创建和删除>中介绍了任务创建API函数xTaskCreate(),我们这里先回顾一下这个函数的声明: BaseType_t xTaskCreate( TaskFunction_tp vTaskCode, const char * constpcName, unsigned short usStackDepth, void *pvParameters, UBaseType_t uxPriority, TaskHan