文档章节

Django的路由系统

ZeroBit
 ZeroBit
发布于 08/05 17:09
字数 984
阅读 7
收藏 0

Django 2.2 官方文档

URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表

静态路由和动态路由

静态路由:已经明确定义好的一条路由,比如下例,用户只能在浏览器上输入/articles/2003/ 才能匹配到这条路由,输入任何其它的都匹配不上本条。

urlpatterns = [
    path('articles/2003/', views.special_case_2003),
]

动态路由:定义的只是路由规则,比如只能输入数字、或特定排列、长度的字符等,你不知道用户会具体输入什么,只要符合你的规则即可。

URLconf配置

Django2.0 基本格式

from django.urls import path
from . import views

urlpatterns = [
    path('articles/2003/', views.special_case_2003),
    path('articles/<int:year>/', views.year_archive),
    path('articles/<int:year>/<int:month>/', views.month_archive),
    path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
]

以下路由对应的views.py视图如下:

def special_case_2003(request):
    return HttpResponse("dddd")

def year_archive(request,year):
    return HttpResponse("year_archive" + str(year))

def month_archive(request,year,month):
    return HttpResponse("month_archive %s-%s" %(year,month))

def article_detail(request,year,month,slug):
    return HttpResponse("article_detail %s-%s %s" %(year,month,slug))

说明:

  • 要从URL捕获一个变量,需要使用尖括号(<>)
  • 需要捕获的变量能够可选择地包含一个转换类型。例如:使用<int:name>捕获一个整数参数。如果没有转换器,则匹配任何不包含(/)的字符
  • 没有必须在URL前面加斜线/。例如:articles而非/articles

请求示例:

  • /articles/2005/03/请求会匹配第三条规则
  • /articles/2003/请求会匹配第一条规则而不是第二条
  • /articles/2003请求不会匹配任何规则,因为这个URL没有以斜线/结尾
  • /articles/2003/03/building-a-django-site/会匹配最后一条规则

默认的Path converters:

  • str:匹配任何非空字符串,不包含路径分隔符/
  • int:匹配任何整数
  • slug:匹配任何字母、数字、下划线(_)和连接线(-)。例如:building-your-1st-django-site
  • uuid:匹配UUID字符串。例如:075194d3-6885-417e-a8a8-6c931e272f00
  • path:匹配任何非空字符串,包含路径分隔符/

自定义Path Converter

自定义Path Converter必须包含以下要素:

- 一个名为`regex`的类属性
- 一个 `to_python(self, value)`方法。该方法表示将匹配的字符串转换为应该传递给视图函数的类型
- 一个`to_url(self, value)`方法。该方法处理将Python类型转换为要在URL中使用的字符串
class FourDigitYearConverter:
    regex = '[0-9]{4}'

    def to_python(self, value):
        return int(value)

    def to_url(self, value):
        return '%04d' % value

使用时需使用register_converter()将自定义Converter注册进Django中:

from django.urls import register_converter, path
 
from . import converters, views
 
register_converter(converters.FourDigitYearConverter, 'yyyy')
 
urlpatterns = [
    path('articles/2003/', views.special_case_2003),
    path('articles/<yyyy:year>/', views.year_archive),
    ...
]

include 子url

当有多个app时,每个app可以有自己的urls.py, 只需在顶级urls.py中include一下就可以

from django.urls import include, path

urlpatterns = [
    # ... snip ...
    path('community/', include('aggregator.urls')),
    path('contact/', include('contact.urls')),
    # ... snip ...
]

django 在匹配url时,只要遇到include()语法, 就会把url分成2部分,比如上面代码里的url, 只要匹配上community/,就会把整条url丢给include('aggregator.urls')子urls.py。 子urls.py负责匹配后面的部分。

减少重复的url

如果url 中出向很多重复的部分,可以按下面的方法聚合

from django.urls import include, path

from apps.main import views as main_views
from credit import views as credit_views

extra_patterns = [
    path('reports/', credit_views.report),
    path('reports/<int:id>/', credit_views.report),
    path('charge/', credit_views.charge),
]

urlpatterns = [
    path('', main_views.homepage),
    path('help/', include('apps.help.urls')),
    path('credit/', include(extra_patterns)),
]

在此例子中,/credit/reports/请求将会被credit_views.report()方法处理

传递额外参数给views

from django.urls import path
from . import views
 
urlpatterns = [
    path('blog/<int:year>/', views.year_archive, {'foo': 'bar'}),
]

在这个例子中,对于/blog/2005/请求,Django 将调用views.year_archive(request, year='2005', foo='bar')

© 著作权归作者所有

ZeroBit

ZeroBit

粉丝 1
博文 63
码字总数 62103
作品 0
南宁
私信 提问
WEB框架之---Django初级篇

一、下载与安装(Windows版) 下载地址:https://www.djangoproject.com/download/ 或者通过命令:pip install django==1.11.2进行安装(Python3使用pip3)推荐使用此版本 安装完成后找到dja...

AltBoy
2018/06/26
0
0
Django项目详解1——简单的web应用

前言 前段时间看完了廖雪峰老师的Python基础, 开始的时候见内容很多,以为学完了就是大牛了,等一节一节的完成了所有的练习和作业才发现,这才刚入门。 考虑了一下方向,想往web方面发展,于...

世外大帝
2018/01/09
0
0
简单了解Django应用app及分布式路由

前言 应用在Django的项目中是一个独立的业务模块,可以包含自己的路由,视图,模板,模型. 一 创建应用程序 创建步骤 用manage.py中的子命令startapp创建应用文件夹 在settings.py的INSTALL...

开元中国2015
07/25
18
0
Python全栈 Web(Django框架、概述、项目配置)

前言: Flask虽然是轻量级框架但是复杂操作需要自己写扩展和灵活性还是非常高的 基于Flask的项目 我就写在一个博客里了 持续更新。。。 Django众所周知的Pythonweb框架 之前写过一篇Django的...

巴黎香榭
2018/10/12
0
0
Django: 路由与视图

简介 Django框架是美国World Company(世界公司?NB)的工程师Adrian Holovaty和Simon Willison在开发其公司运行的新闻网站(LJWorld.com、Lawrence.com、KUsports.com ) 过程中,逐渐完善丰...

笔阁
2015/11/10
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

友元函数强制转换

友元函数强制转换 p522

天王盖地虎626
昨天
5
0
js中实现页面跳转(返回前一页、后一页)

本文转载于:专业的前端网站➸js中实现页面跳转(返回前一页、后一页) 一:JS 重载页面,本地刷新,返回上一页 复制代码代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a h...

前端老手
昨天
4
0
JAVA 利用时间戳来判断TOKEN是否过期

import java.time.Instant;import java.time.LocalDateTime;import java.time.ZoneId;import java.time.ZoneOffset;import java.time.format.DateTimeFormatter;/** * @descri......

huangkejie
昨天
4
0
分页查询

一、配置 /*** @author beth* @data 2019-10-14 20:01*/@Configurationpublic class MybatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor(){ ......

一个yuanbeth
昨天
6
0
在LINQPad中使用Ignite.NET

LINQPad是进行.NET开发的一款优秀工具,非常有利于Ignite.NET API的快速入门。 入门 下载LINQPad:linqpad.net/Download.aspx,注意要选择64位操作系统的AnyCPU版本; 安装Ignite.NET的NuGet...

李玉珏
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部