Django视图之URLconfs
2017-11-07 15:13
211 查看
对于一个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='2005', month='03'), instead of views.month_archive(request, '2005', '03').
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的URLconf中使用多个视图前缀的方法
- Django入门-6:视图(URLconf使用)
- Django的URLconf中使用缺省视图参数的方法
- Django框架下在URLconf中指定视图缓存的方法
- Django的URLconf中使用缺省视图参数的方法
- Django框架下在URLconf中指定视图缓存的方法
- 在Django的URLconf中使用多个视图前缀的方法
- Django系列教程(5)-- 视图URLconf及视图函数的定义
- Django进阶——高级视图和url配置
- Django学习总结之三-视图和url配置
- Python+Django+SAE系列教程9-----Django的视图和URL
- django_book学习笔记2-视图和URL配置
- 在Django的URLconf中使用命名组的方法
- Django的URLConf技巧
- Django 初识 - 视图和url配置
- 第二章Djangos视图和URL配置
- Django 中的Url、HTTP机制和视图
- The Definitive Guide To Django 2 学习笔记(三) URLconfs 和松耦合
- Django学习笔记1 url、视图和模板
- 在Django的URLconf中进行函数导入的方法