Django视图之URLconfs
对于一个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
- 在模板中:使用 url 标签。
- 在代码中:使用
reverse()
。 - 在更高级的代码中:使用
get_absolute_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的更多相关文章
- python 3+djanjo 2.0.7简单学习(四)--Django视图
1.概念 Django 中的视图的概念是「一类具有相同功能和模板的网页的集合」.比如,在一个博客应用中,你可能会创建如下几个视图: 博客首页——展示最近的几项内容. 内容“详情”页——详细展示某项内容 ...
- Django Views and URLconfs
碧玉妆成一树高,万条垂下绿丝绦. 不知细叶谁裁出,二月春风似剪刀. 原文尽在:http://djangobook.com/ 转载请注明出处:http://www.cnblogs.com/A-FM/p/ ...
- 第一个Django应用 - 第三部分:Django视图和模板
一.概述 一个视图就是一个页面,通常提供特定的功能,使用特定的模板.例如:在一个博客应用中,你可能会看到下列视图: 博客主页:显示最新发布的一些内容 每篇博客的详细页面:博客的永久链接 基于年的博客页 ...
- [diango]理解django视图工作原理
前言:正确理解django视图view,模型model,模板的概念及其之间的关联关系,才能快速学习并上手使用django制作网页 本文主要讲解自己在学习django后对视图view的理解 在进入正文之 ...
- Django 2.0 学习(03):Django视图和URL(下)
接上篇博文,继续分析Django基本流程. 编写第一个(view)视图函数 1.打开文件polls/views.py,输入下面的Python代码: from django.http import Ht ...
- 如何在django视图中使用asyncio(协程)和ThreadPoolExecutor(多线程)
Django视图函数执行,不在主线程中,直接 loop = asyncio.new_event_loop() # 更不能loop = asyncio.get_event_loop() 会触发 Runt ...
- Django 视图系统
Django 视图系统 概念 一个视图函数,简称视图,是一个简单的Python函数,用于接受Web请求并返回Web响应. 通常将视图函数写在project或app目录中的名为views.py文件中 简 ...
- 令Django 视图有默认 login_required
方法一 from django.template import RequestContext from django.shortcuts import render_to_response from ...
- Django视图层之路由配置系统(urls)
视图层之路由配置系统(urls) URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个U ...
随机推荐
- Java从零开始学三十九(对象序列化)
一.序列化 将对象的状态存储到特定存储介质中的过程 对象序列化,就是把一个对象变为二进制的数据流的一种方法,通过对象序列化可以方便的实现对象的传输或存储. 序列化保存对象的“全景图”,构建对象的“ ...
- spring boot 1.5.2 操作mongodb3.4.0
1:build.gradle 添加mongodb依赖 dependencies { compile('org.springframework.boot:spring-boot-starter-web' ...
- 【独立开发人员er Cocos2d-x实战 001】csb文件导出和载入
使用cocos studio进行资源文件导出: 然后在cocosproject中进行载入csb文件: auto myLayout = CSLoader::createNode("/res/ ...
- js 判断iframe是否加载完毕
js 判断iframe是否加载完毕 CreationTime--2018年9月13日15点30分 Author:Marydon 1.javascript实现 window.onload = fun ...
- 新浪微博API使用初步介绍——解决回调地址的问题
# -*- coding: utf-8 -*- #python 27 #xiaodeng #新浪微博API使用初步介绍——解决回调地址的问题 #http://blog.csdn.net/monsion ...
- 网址URL中特殊字符转义编码
网址URL中特殊字符转义编码字符 - URL编码值空格 - %20" - %22# - %23% - %25& - %26( - %28) - %29+ - %2B, - %2C/ ...
- maven 错误处理
如果是方法找不到或者返回参数变了,那么肯定是包被升级了,那么到仓库下把对应的包删掉,然后maven自动下载最新的. 如果是包找不到,或者类找不到,那么把maven ->update maven可 ...
- 【转载】加密Spring加载的Properties文件
目标:要加密spring的jdbc配置文件的密码口令. 实现思路:重写加载器的方法,做到偷梁换柱,在真正使用配置之前完成解密. 1.扩展 package com.rail.comm; import j ...
- linux ---性能监控(工具)
linux服务器性能监控-nmon Nmon 是一个分析aix和linux性能的免费工具,出自IBM,其采集的数据通过nmon_analyser生成报表 一.下载 官网下载地址 百度网盘 二.运行和使 ...
- LINUX创建本地yum源
.创建一个文件夹,把光盘中所有的RPM安装包都拷贝进来 # mkdir /rpms_yum .把光盘上的RPM包全部复制到rpms_yum中 # cd /mnt/cdrom/Packages/ # c ...