热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

django之路由分发

路由分发决定哪一个路由由哪一个视图函数来处理。注意:django2.0里的re_path和django1.0里的url除了名字不一样,其他都一样。简单配置注意:若要从UR

路由分发决定哪一个路由由哪一个视图函数来处理。

注意:django2.0里的re_path和django1.0里的url除了名字不一样,其他都一样。

简单配置

from django.urls import path,re_path

from app01 import views
urlpatterns = [
    path(\'admin/\', admin.site.urls),
    path(\'timer/\',views.timer),


    # 路由配置:  决定哪一个路由由哪一个视图函数来处理
    # repath和django1.0里的url用法一样
    # 不写^,articles前面可以写任何东西(edward/123/articles);同理,不写$,2003后面也可以写任何东西。
    re_path(r\'^articles/2003/$\',views.special_case_2003),

    # 正则匹配年份
    # 如果是2003,会匹配第一个
    # 如果去掉$就不走第三个了,因为匹配到年份那就不往后匹配了,而是直接执行arvhive_year了。
    re_path(r\'^articles/([0-9]{4})/$\',views.archive_year), # year_archive(request,1999)。django2.1.5不用传第二个参数了

    re_path(r\'^articles/([0-9]{4})/([0-9]{2})/$\',views.month_archive),

    # re_path(r\'^articles/(?P[0-9]{4})/(?P[0-9]{2})/(?P[0-9]{2})/$\', views.article_detail),
]

 

注意:

  • 若要从URL 中捕获一个值,只需要在它周围放置一对圆括号。

  • 不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles 而不是 ^/articles

  • 每个正则表达式前面的\'r\' 是可选的但是建议加上。它告诉Python 这个字符串是“原始的” —— 字符串中任何字符都不应该转义

 

有名分组

# urls
    # 有名分组,?P相当于是起了个名字,然后把名字当做参数传给视图函数,后面才是正则部分。
    re_path(r\'^articles/(?P[0-9]{4})/(?P[0-9]{2})/$\',views.month_archive),
   \'\'\'
   month_archive(request,year=2009,momth=12)  
   这样在views视图,不管传入的参数的顺序是什么,year就是year,month就是month,但是名字必须是year和month
   \'\'\'

#views
def month_archive(request, month,year):  # 顺序颠倒也没有问题,不管顺序是什么都会正常显示year和month
    return HttpResponse(\'year:%s,month:%s\' % (year,month))

 

路由分发

在app01下面重新创建一个urls的文件,把关于app01的url放到里面,然后再在公共项目的urls里导入app01的urls

# app01 urls.py
from django.urls import path, re_path

from app01 import views

urlpatterns = [。
    re_path(r\'^articles/2003/$\', views.special_case_2003),
    re_path(r\'^articles/([0-9]{4})/$\', views.archive_year),  # year_archive(request,1999)。
    re_path(r\'^articles/(?P[0-9]{4})/(?P[0-9]{2})/$\', views.month_archive),
]

# demo urls.py
urlpatterns = [
    path(\'admin/\', admin.site.urls),
    path(\'timer/\', views.timer),

    # 分发:
    re_path(r\'^app01\', include(\'app01.urls\')),   
    # re_path(r\'^\', include(\'app01.urls\')   #  路径里面不用写app01了
]

 

反向解析

 反向解析就是给url起一个别名,我们用别名去找这个url就行,这样不管url如何改变,我们都可以用别名找到它。

1. 在模板中进行反向解析

urls.py

from django.urls import path, re_path, include

from app01 import views

urlpatterns = [
    path(\'admin/\', admin.site.urls),
    path(\'timer/\', views.timer),
    path(\'login.html/\',views.login,name=\'Log\'),

    # 分发:
    re_path(r\'^\', include(\'app01.urls\')),
]

 

login.html

DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Logintitle>
head>
<body>


<form action="{% url \'Log\' %}" method="post">
    用户名 <input type="text" name="user">
    密码 <input type="password" name="pwd">
    <input type="submit">
form>

body>
html>

 

2. 在视图函数里进行反向解析

# app01 urls

re_path(r\'^articles/2003/$\', views.special_case_2003,name =\'s_c_2003\'),
re_path(r\'^articles/([0-9]{4})/$\', views.archive_year,name=\'y_a\'),

from django.urls import reverse
def special_case_2003(request):
    url = reverse(\'s_c_2003\')  #  不需要参数,因为不含正则是一个完整的url,找到后直接匹配
    url2 = reverse(\'y_a\',args=(4009,))   #  ^articles/([0-9]{4})/ 需要给一个四位数字的参数,匹配正则,参数可以是任意四位数字,具体数字按需求写。
    print(url)  # /articles/2003/
    print(url2)  # /articles/4009/
    return HttpResponse("

special_case_2003

") # HttpResponse里面写的是响应体的内容

 

命名空间

主项目 urls.py

from django.urls import path, re_path, include

from app01 import views

urlpatterns = [
    path(\'admin/\', admin.site.urls),
    path(\'timer/\', views.timer),
    path(\'login.html/\', views.login, name=\'Log\'),

    # 分发:
    # 命名空间不可以重名
    re_path(r\'^app01\', include((\'app01.urls\', \'app01\'))),
    re_path(r\'^app02\', include((\'app02.urls\', \'app02\'))),
]

 

app01

 # urls
re_path(\'index/\',views.index,name=\'index\')

# views
def index(request):


    # return HttpResponse(reverse(\'index\'))  # 找到的也是app02的index,用名称空间解决这个问题。

    # 用命名空间解决
    return HttpResponse(reverse(\'app01:index\')) # # 冒号之前是namespace,冒号之后是名字

 

app02

# urls
re_path(\'index/\',views.index,name=\'index\')

# views
def index(request):

    # return HttpResponse(reverse(\'index\'))  # 找到的app02的index,用命名空间解决名字冲突的问题

    return HttpResponse(reverse(\'app02:index\'))

 

path方法(django2.0)

re_path有两个问题:

 

1.不能进行字符转换。

def month_archive(request, month, year):
    print(type(month))  # str
    print(type(year))  # str
    return HttpResponse(\'year:%s,month:%s\' % (year, month))

 

2.同样的正则表达式,需要写多遍,不易于维护。

urlpatterns = [  
    re_path(\'articles/(?P[0-9]{4})/\', year_archive),  
    re_path(\'article/(?P[a-zA-Z0-9]+)/detail/\', detail_view),  
    re_path(\'articles/(?P[a-zA-Z0-9]+)/edit/\', edit_view),  
    re_path(\'articles/(?P[a-zA-Z0-9]+)/delete/\', delete_view),  
]

 

而path可以解决这两个问题

# urls
from django.urls import path
path(\'articles/\',views.path_year)

#views
def path_year(request,year):
    print(type(year))   # int
    return HttpResponse(\'path year\')

 

基本规则:

  • 使用尖括号(<>)从url中捕获值。

  • 捕获值中可以包含一个转化器类型(converter type),比如使用 捕获一个整数变量。若果没有转化器,将匹配任何字符串,当然也包括了 / 字符。

  • 无需添加前导斜杠。

 

path转换器

Django默认支持以下5个转化器:

  • str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式

  • int,匹配正整数,包含0。

  • slug,匹配字母、数字以及横杠、下划线组成的字符串。

  • uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。

  • path,匹配任何非空字符串,包含了路径分隔符

 

自定义path转换器

在实际开发中,django自带的转换器是不能满足我们的需求的,这就需要自定义转换器了

操作步骤:

1.在app里创建一个类,写自定义转换的规则

url_convert.py

class MonConvert:
    regex = "[0-9]{2}"   # 只能叫regex

    def to_python(self, value):
        return int(value)  #  不转化就是字符串,可以根据需求做任何操作。

    def to_url(self, value):  # 用于反向解析
        return "%04d" % value

 

2.在urls里注册自定义转换器

from django.urls import path, re_path, include,register_converter
from app01.url_convert import MonConvert

# 注册自定义转换器
register_converter(MonConvert,\'mm\')

 

3.在路由分发里使用自定义转换器

urlpatterns = [
    path(\'articles/\',views.path_month),
]

 

Registering custom path converters¶

For more complex matching requirements, you can define your own path converters.

A converter is a class that includes the following:

  • regex class attribute, as a string.
  • to_python(self, value) method, which handles converting the matched string into the type that should be passed to the view function. It should raise ValueError if it can’t convert the given value.
  • to_url(self, value) method, which handles converting the Python type into a string to be used in the URL.

 


推荐阅读
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了一些Java开发项目管理工具及其配置教程,包括团队协同工具worktil,版本管理工具GitLab,自动化构建工具Jenkins,项目管理工具Maven和Maven私服Nexus,以及Mybatis的安装和代码自动生成工具。提供了相关链接供读者参考。 ... [详细]
author-avatar
ayuanliang
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有