Django 路由层URLconf的实现
作者:liuxu2019 发布时间:2021-01-18 17:05:13
分组
分组的目的:让服务端获得url中的具体数据,通过分组,把需要的数据按函数传参的方式传递给服务器后台
1-无名分组
若要从URL 中捕获一个值,只需要在它周围放置一对圆括号
# app01/urls.py
from django.urls import path, re_path
from app01 import views
app_name = "app01"
urlpatterns = [
path("login/", views.login, name="Log"),
re_path(r"articles/([0-9]{4})/([0-9]){2}/", views.articles),
]
# app01/views.py
def articles(request, year, month ):
print(year, month)
return HttpResponse(year+"-"+month)
2-有名分组
在更高级的用法中,可以使用命名的正则表达式组来捕获URL 中的值并以关键字 参数传递给视图。
在Python 正则表达式中,命名正则表达式组的语法是(?P<name>),其中name 是组的名称,下面是以上URLconf 使用命名组的重写。
# app01/urls.py
from django.urls import path, re_path
from app01 import views
app_name = "app01"
urlpatterns = [
path("login/", views.login, name="Log"),
re_path(r"articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2}/)", views.articles),
]
捕获的值作为关键字参数而不是位置参数传递给视图函数
# app01/views.py
def articles(request, month, year ):
print(year, month)
return HttpResponse(year+"-"+month)
分发
分发的目的:解决一个django项目中因为存在多个应用app导致project下面的urls臃肿和分配混乱的问题
分发的具体操作流程是:
step1:项目文件下的urls.py,使用include()
# project/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path(r"app01/", include("app01.urls")),
]
step2:app下的具体url
# app01/urls.py
from django.urls import path
from app01 import views
urlpatterns = [
path("login/", views.login),
]
step3:视图函数render时模板路径前缀
# app01/views.py
from django.shortcuts import render
# Create your views here.
def login(request):
return render(request, "app01/login.html")
step4:模板
# app01/templates/app01/login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>app01_title</title>
</head>
<body>
<h2>app01_login</h2>
<hr>
<form action="" method="post">
<p>用户名 <input type="text" name="name"></p>
<p>密码 <input type="password" name="pwd"></p>
<p><input type="submit" value="登录"></p>
</form>
</body>
</html>
反向解析
反向解析的目的:解决url硬编码的问题,即不能写死一个url,否则日后修改url,造成的维护成本巨大
此时可以给url命名,然后可以在视图和模板中使用url别名,反向解析出正式的url
反向解析分两种:模板中解析、视图中解析
模板中解析 <form action="{% url "Art" 12 %}" method="post">
# app01/urls.py
from django.urls import path
from app01 import views
urlpatterns = [
path("login/", views.login, name="Log"),
path("articles/<int:id>/", views.articles, name="Art"), #有参
]
# app01/templates/app01/login.html
<form action="{% url "Log" %}" method="post">
<p>用户名 <input type="text" name="name"></p>
<p>密码 <input type="password" name="pwd"></p>
<p><input type="submit" value="登录"></p>
</form>
<form action="{% url "Art" 12 %}" method="post">
<p>用户名 <input type="text" name="name"></p>
<p>密码 <input type="password" name="pwd"></p>
<p><input type="submit" value="登录"></p>
</form>
视图中解析 reverse("Art", args=(id,))
# app01/views.py
from django.shortcuts import render
from django.urls import reverse
# Create your views here.
def login(request):
print(reverse('log'))
id=10
print(reverse("Art", args=(id,)))
return render(request, "app01/login.html")
命名空间
命名空间要配合反向解析使用,当存在多个app,url的name冲突时,需要指定该name的命名空间
# project/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path(r"app01/", include("app01.urls", namespace="app01")),
path(r"app02/", include("app02.urls", namespace="app02")),
]
在django2.x中,app01/url.py需要添加 app_name = "app01"
# app01/urls.py
from django.urls import path
from app01 import views
app_name = "app01"
urlpatterns = [
path("login/", views.login, name="Log"),
]
# app01/views.py(需要时设置)
from django.shortcuts import render
from django.urls import reverse
# Create your views here.
def login(request):
a = reverse("app01:Log")
print("app01:", a)
return render(request, "app01/login.html")
# app01/templates/app01/login.html(需要时设置)
<form action="{% url "app01:Log" %}" method="post">
<p>用户名 <input type="text" name="name"></p>
<p>密码 <input type="password" name="pwd"></p>
<p><input type="submit" value="登录"></p>
</form>
转换器
对于django2.0版本以后,出现新的path() urlconf,他有两个好处:
1:url修改维护变得简单
2:url获得的参数的数据类型不再是单纯的str,在path中可以通过转换器实现参数数据类型的转换
path()中存在5个内置转化器:
=1. str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
2. int,匹配正整数,包含0。
3. slug,匹配字母、数字以及横杠、下划线组成的字符串。
4. uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
5. path,匹配任何非空字符串,包含了路径分隔符
使用方法:
step1: app01/urls.py
from django.urls import path, re_path
from app01 import views
app_name = "app01"
urlpatterns = [
path("login/", views.login, name="Log"),
# re_path(r"articles/(?P<year>[0-9]{4})/", views.articles),
path("articles/<int:year>/<int:month>/", views.articles),
]
step2: app01/views.py
def articles(request, year, month):
print(year, month)
print(type(year))
return HttpResponse("ok")
<int: year> 相当于re_path()中的 (?P[0-9]{4})
<> 表示有名分组,year是组名;int表示传参的数据类型是正整数(但包括0)
自定义转换器
step1: app01/my_converters.py
class YearConverter:
regex = '[0-9]{4}'
def to_python(self, value):
return int(value)
def to_url(self, value):
return '%04d' % value
step2: app01/urls.py
from django.urls import path, re_path, register_converter
from app01 import views, my_converters
register_converter(my_converters.YearConverter, 'year')
app_name = "app01"
urlpatterns = [
path("login/", views.login, name="Log"),
# re_path(r"articles/(?P<year>[0-9]{4})/", views.articles),
# path("articles/<int:year>/<int:month>/", views.articles),
path("books/<year:y>", views.books),
]
step3: app01/views.py
def books(request, y):
print(y, type(y))
return HttpResponse("ok,books")
来源:https://www.cnblogs.com/liuxu2019/p/12116778.html


猜你喜欢
- 一、基本概念Reactive X中有几个核心的概念,先来简单介绍一下。1.1、Observable和Observer(可观察对象和观察者)首
- PyQuery库就是python中的一个解析库。作用十分强大,使用上也是相当的灵活,能够实现初始化字符串、初始化 HTML 文件、初始化请求
- 今儿继续再看老师给推荐的深入浅出mysql数据库开发这本书,看到innodb数据库的外键关联问题时,遇到了一个问题,书上写的是可以对父表进行
- 本文实例为大家分享了JavaScript缓动动画函数的封装代码,供大家参考,具体内容如下本文将从封装缓动动画的以下几个部分进行封装(1、单个
- 这篇文章主要介绍了Python hashlib常见摘要算法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- 正在看的ORACLE教程是:Oracle不同数据库间对比分析脚本。Oracle数据库开发应用中经常对数据库管理员有这样的需求,对比两个不同实
- 大家都知道,Matplotlib 是众多 Python 可视化包的鼻祖,也是Python最常用的标准可视化库,其功能非常强大,同时也非常复杂
- 如何在本地机器上创建缓存?用法到是很简单,只需先创建Stream对象的实例,然后开始写入数据即可: Dim str&n
- 最近JETBRAINS发布了目前最受欢迎的python-web开发框架,可以看到最受欢迎的还是Django和Flask,那么本文就对上榜的1
- 1.创建vue项目vue create demodemo是项目名称2.安装axios进入demo里面打开终端(黑窗口),执行npm inst
- SQL Server数据库查询速度慢的原因有很多,常见的有以下几种:1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)
- Ping服务ping 是基于 XML_RPC 标准协议的更新通告服务,用于Blog把内容更新快速通知给搜索引擎,以便搜索引擎及时进行抓取和更
- 比如用 print ','.join(datelist) 就可以将datelist列表里面的所有项目并成一个字符串,当然这个
- 1.登录mysql: mysql -u root -h 127.0.0.1 -p2.切换数据库 use mysql3.授权grant all
- 下载opencv2.4.9(python2.7匹配)后 (1)运行OpenCV 2.4.9.exe;(2)配置Python:将\opencv
- PDOStatement::setAttributePDOStatement::setAttribute — 设置一个语句属性(PHP 5
- 本文实例讲述了Python实现OpenCV的安装与使用。分享给大家供大家参考,具体如下:由于下一步要开始研究下深度学习,而深度学习领域很多的
- 这年头,信息和获得信息的渠道越来越多。随着信息量的增大,先有了分类,又有了导航,再有了搜索,后面的发展还不得而知。在此只是根据平日的所看所想
- 网上有这样一道题目:一个字符串String=“adadfdfseffserfefsefseetsdg”,找出里面出现次数最多的字母和出现的次
- 1.认识数组数组就是某类数据的集合,数据类型可以是整型、字符串、甚至是对象Javascript不支持多维数组,但是因为数组里面可以包含对象(