对于一个web程序而言,接收和处理用户的请求并返回响应是一个最基本的、也是最重要的功能。

Django为这个功能取了一个好听的名字——“视图”。

而具体的代码实现往往是通过一个个函数,Django中也叫做视图函数

URL调度器

Django对于URL的设计都放在一个叫做URLconf的模块中(urls.py)。

在该模块中,对URL pattern和视图函数进行了映射。

处理一个请求:

1.Django确定所使用的根URLconf模块,通常就是settings中的ROOT_URLCONF(字符串)这个变量。

如果HTTPRequest有一个urlconf属性,则使用该属性设置的值覆盖ROOT_URLCONF的值。

2.在模块中查询urlpatterns变量,他是一个包含django.conf.urls.url()实例的列表。

url(regex, view, kwargs=None, name=None)
:param str|ugettext_lazy() regex: 表示一个正则表达式,通常使用原始字符串(r'')。
注意:\d是个例外,r'\d'表示十进制整数而不是字符串'\d'。
:param func view: 视图函数、as_view()或者 include()。
:param dict kwargs: 用来向视图函数传递额外的参数。
:param str name: urlpattern的别名。

3.Django依此遍历urlpatterns,直到第一次匹配request.path

4.Django导入匹配到的视图函数并执行。传递给函数的参数有:

  • HTTPRequest的实例
  • 如果匹配的正则不返回命名组,则匹配到的对象会以位置参数的形式传递给函数
  • 如果匹配的正则返回命名组,则该命名组会以关键字参数(key='value')的方式传给函数。如果kwargs中有同名的键,则该命名组的值会被覆盖。

5.如果匹配不到或者中间出现异常,则会调用相应的异常处理函数。详情参见Error handling

注意:

  • 要给URL传值,只需要在regex中使用括号包含该值即可(r'^articles/([0-9]{4})/$')。
  • 不需要在regex最开始处加'/'。
  • 关于原始字符串的讨论可参见Dive Into Python’s explanation

命名组

正则中命名组的语法:

 (?P<name>pattern)

name是命名组的名字,pattern是匹配的模式。

区别:

 views.month_archive(request, year='', month=''), instead of views.month_archive(request, '', '').

 URLconf的本质就是不包含域名,方案,方法参数的字符串,类似资源路径,不以'/'开始。

include()

include(module, namespace=None, app_name=None)
:param str module: URLconf模块
:param str namespace: URL条目的实例名称空间
:param str app_name: URL条目的应用程序的名称空间 include(pattern_list)
:param list pattern_list: django.conf.urls.url()的实例

内嵌的捕捉参数

regex中的非捕捉参数

(?:...)

反向解析URL

# 在模板中
<a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a>
{# Or with the year in a template context variable: #}
<ul>
{% for yearvar in year_list %}
<li><a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a></li>
{% endfor %}
</ul> # 在代码中
from django.urls import reverse
from django.http import HttpResponseRedirect def redirect_to_year(request):
# ...
year = 2006
# ...
return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))

带有名称空间的反向解析:

# 在模板中
{% url 'polls:index' %} # 在代码中
reverse('polls:index', current_app=self.request.resolver_match.namespace)

reverse()

reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None
:param str|func viewname: urlpattern的名称或者视图函数
:param str urlconf: 包含urlpattern的模块
:param all args: 传递给URL的参数
:param dict kwargs: 传递给URL的参数
:param current_app: 应用程序的名称空间。

Django视图之URLconfs的更多相关文章

  1. python 3+djanjo 2.0.7简单学习(四)--Django视图

    1.概念 Django 中的视图的概念是「一类具有相同功能和模板的网页的集合」.比如,在一个博客应用中,你可能会创建如下几个视图: 博客首页——展示最近的几项内容. 内容“详情”页——详细展示某项内容 ...

  2. Django Views and URLconfs

    碧玉妆成一树高,万条垂下绿丝绦. 不知细叶谁裁出,二月春风似剪刀. 原文尽在:http://djangobook.com/ 转载请注明出处:http://www.cnblogs.com/A-FM/p/ ...

  3. 第一个Django应用 - 第三部分:Django视图和模板

    一.概述 一个视图就是一个页面,通常提供特定的功能,使用特定的模板.例如:在一个博客应用中,你可能会看到下列视图: 博客主页:显示最新发布的一些内容 每篇博客的详细页面:博客的永久链接 基于年的博客页 ...

  4. [diango]理解django视图工作原理

    前言:正确理解django视图view,模型model,模板的概念及其之间的关联关系,才能快速学习并上手使用django制作网页 本文主要讲解自己在学习django后对视图view的理解 在进入正文之 ...

  5. Django 2.0 学习(03):Django视图和URL(下)

    接上篇博文,继续分析Django基本流程. 编写第一个(view)视图函数 1.打开文件polls/views.py,输入下面的Python代码: from django.http import Ht ...

  6. 如何在django视图中使用asyncio(协程)和ThreadPoolExecutor(多线程)

    Django视图函数执行,不在主线程中,直接 loop = asyncio.new_event_loop() # 更不能loop = asyncio.get_event_loop() 会触发 Runt ...

  7. Django 视图系统

    Django 视图系统 概念 一个视图函数,简称视图,是一个简单的Python函数,用于接受Web请求并返回Web响应. 通常将视图函数写在project或app目录中的名为views.py文件中 简 ...

  8. 令Django 视图有默认 login_required

    方法一 from django.template import RequestContext from django.shortcuts import render_to_response from ...

  9. Django视图层之路由配置系统(urls)

    视图层之路由配置系统(urls) URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个U ...

随机推荐

  1. 网站中超链接方式直接添加QQ好友

    使用情景: 在图中点击图片,会弹出添加qq好友的窗口进行好友添加. 链接如下: tencent://AddContact/?fromId=45&fromSubId=1&subcmd=a ...

  2. Unix 网络编程 读书笔记2

    第三章 套接字编程简介 每一个 Socket 都用一个半相关描述:{协议,本地地址,本地端口}一个完整的 Socket 则用一个相关描述{协议,本地地址,本地端口,远程地址,远程端口}每一个 Sock ...

  3. 【Linux】文件描述符与重定向

    重定向符号 符号 描述 > 输出重定向到一个文件或设备 覆盖原来的文件 >! 输出重定向到一个文件或设备 强制覆盖原来的文件 >> 输出重定向到一个文件或设备 追加原来的文件 ...

  4. A链接IE6、7下失效场景及解决方案

    1.当img元素包含在多个层级关系里时,只要触发了img元素的父元素的hasLayout,那么就会造成在IE6\7下A标签失效. <!DOCTYPE html PUBLIC "-//W ...

  5. 2014年,daliu_it 年末文章汇总清单

    一.javabase 1. Windows环境下JDK安装与环境变量配置 详细的介绍了JDK的安装以及配图,同时安装的注意事项. 2. 项目的命名规范,为以后的程序开发中养成良好的行为习惯 详细的介绍 ...

  6. DevExpress添加Winform窗体到DockPanel

    在使用DevExpress过程中,原先已经创建好的导航窗体,如何添加到DockPanel中进行展示? FormX frmX = new FormX(); frmX.Show(this.DockPane ...

  7. 微信小程序开发动感十足的加载动画--都在这里!

    代码地址如下:http://www.demodashi.com/demo/14242.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.co ...

  8. 用JS实现任意导航栏的调用

    首先设计一个关于导航的层叠样式表如:body{font-size:12px;font-family:Arial,Helvetica,'宋体',sans-serif;color:#333;backgro ...

  9. Fork me on GitHub

    <a href="https://github.com/yadongliang"><img style="position: absolute; top ...

  10. SecureCRT 设置中文编码

    http://www.diybl.com/course/6_system/linux/Linuxjs/20090326/163546.html     装了个secureCRT,可老是出现乱码  于是 ...