Django路由系统

分组命名匹配

​ 在上述基本配置示例中,使用了简单的正则表达式分组匹配来捕获URL中的值并以位置参数的形式传递给视图,例如url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive)。而更高级的用法是,使用分组命名正则表达式组来捕获URL中的值并以关键字参数的形式传递给视图。

​ 在Python的正则表达式中,分组命名正则表达式组的语法是(?P<name>pattern),其中name是组的名称,pattern是要匹配的模式。

【示例】

from django.conf.urls import url

from . import views

urlpatterns = [
url(r'^articles/2003/$', views.special_case_2003),
url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),
]

这个实现与前面的示例只有一个小的差别:捕获的值作为关键字参数而不是位置参数传递给视图函数。

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^jjzz/(?P<year>[0-9]{4})/$', views.Index.as_view()),
] # 当通过/jjzz/2019/进行访问时,就相当于以 views.Index.as_view(request,year='2019')
# 在views函数中要加上关键字参数或者使用**kwagrs接收参数,如下:
class Index(View):
jjzz = 'jjzz on the world'
def get(self, request,**kwargs):
print(kwargs)
print(kwargs["year"])
return JsonResponse({'jjzz': self.jjzz}) 或者def get(self, request,year):

分组命名匹配的特点

​ 使用分组命名匹配的方式可以让URLconf 更加明晰且不容易产生参数顺序问题的错误;但是一定程度上认为,分组命名组语法太丑陋、繁琐。

URLconf匹配的位置

​ URLconf 在请求的URL 上查找,将它当做一个普通的Python 字符串。不包括GET和POST参数以及域名。

​ 例如,http://www.example.com/myapp/ 请求中,URLconf 将查找 /myapp/ 。

​ 在http://www.example.com/myapp/?page=3 请求中,URLconf 仍将查找 /myapp/ 。

​ URLconf 不检查请求的方法。也就是说,所有的请求方法 —— 同一个URL的POSTGETHEAD等等 —— 都将路由到相同的函数。

捕获的参数永远都是字符串

​ 无论正则表达式使用的是什么匹配方式,每个在URLconf中捕获的参数都作为一个普通的Python字符串传递给视图。例如,下面这行URLconf 中:

url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),

传递到视图函数views.year_archive() 中的year参数永远是一个字符串类型。

视图函数中指定默认值

在urls配置中
urlpatterns = [
url(r'^jjzz/', views.Index.as_view()),
url(r'^jjzz/(?P<year>[0-9]{4})/$', views.Index.as_view()),
] 在views配置中
class Index(View):
jjzz = 'jjzz on the world'
def get(self, request, year='2019'):
return JsonResponse({'jjzz': self.jjzz})

​ 在上述的配置前提下,两个URL模式指向相同的view views.Index.as_view() 但是第一个模式并没有从URL中捕获任何东西。如果第一个模式匹配上了,gte()函数将使用其默认参数year='2019',如果第二个模式匹配,page()将使用正则表达式捕获到的year的值。

include其他的URLconfs

当urls配置在APP中时,这时需要使用include函数将其从APP中引用到主urls中。

# 在项目urls中的配置
from django.conf.urls import url
from django.conf.urls import include
from django.contrib import admin urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^app01/', include("app01.urls")),
] # 在app01中的配置
from django.conf.urls import url
from . import views urlpatterns = [
url(r'^jjzz/(?P<year>[0-9]{4})/$', views.Index.as_view()),
url(r'^fileupload/$', views.Upload.as_view()),
] # 访问时的路由地址
http://127.0.0.1:8000/app01/jjzz/2019/ # 相当 主目录 指到 子目录 再指到 函数,类似于路径的拼接

给视图函数传递额外的参数

​ 上篇博客介绍过URL的基本格式,其中第三个位置可以以字典的形式向视图传递参数,官方定义django.conf.urls.url() 可以接收一个可选的第三个参数,它是一个字典,表示想要传递给视图函数的额外关键字参数。

​ 【示例】

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^jjzz/(?P<year>[0-9]{4})/$', views.Index.as_view(),{"type":"XXXXXX"}),
url(r'^fileupload/$', views.Upload.as_view()),
] # 在视图的对应函数中,需要定义额外参数来接收
class Index(View):
jjzz = 'jjzz on the world'
def get(self, request,**kwargs):
print(kwargs)
print(kwargs["year"])
print(kwargs["type"])
return JsonResponse({'jjzz': self.jjzz})

最新文章

  1. [No000068]document.body.clientHeight 和 document.documentElement.clientHeight 的区别
  2. HTML 学习笔记 JavaScript (DOM)
  3. UseFul Collection
  4. python 小知识
  5. Docker on CentOS for beginners
  6. SSH 端口映射(一)
  7. lldb
  8. 2012 East Central Regional Contest 解题报告
  9. Git CMD - add: Record changes to the repository
  10. 一个用于清除loadrunner产生log文件的批处理
  11. HIbernate java.lang.AbstractMethodError: com.microsoft.jdbc.base.BaseDatabaseMetaData.supportsGetGeneratedKeys()Z
  12. getHibernateTemplate().find()
  13. 【Servlet3.0新特性】第03节_文件上传
  14. 使用ActionBar实现下拉式导航
  15. wpf研究之道——datagrid控件数据绑定
  16. java实习面试题(阿里一面)
  17. java面试一、1.3线程与进程
  18. PHP之缓存雪崩,及解决方法(转)
  19. centos7 下安装pycharm
  20. GROUP BY 聚合函数(max min sum avg count) 和HAVING的 使用

热门文章

  1. Spring前置方法无法阻止原方法执行(转)
  2. HDU 6045 - Is Derek lying | 2017 Multi-University Training Contest 2
  3. css百分比值到底参考谁?
  4. B/S上传超大文件解决方案
  5. luogu p4141 消失之物(背包dp+容斥原理)
  6. C语言的预编译,程序员必须懂的知识!【预编译指令】【预编译过程】
  7. 记一次newApiHadoopRdd查询数据不一致问题
  8. Teamviewer解决许可证授权的问题
  9. LeetCode 105. 从前序与中序遍历序列构造二叉树(Construct Binary Tree from Preorder and Inorder Traversal)
  10. 【编程漫谈】用JAVA画多边形