Django 路由层URLconf的实现


Posted in Python onDecember 30, 2019

分组

分组的目的:让服务端获得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")

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python UnicodeEncodeError: 'gbk' codec can't encode character 解决方法
Apr 24 Python
浅析python中的分片与截断序列
Aug 09 Python
详解python开发环境搭建
Dec 16 Python
Python列表(List)知识点总结
Feb 18 Python
Python使用字典的嵌套功能详解
Feb 27 Python
Python脚本修改阿里云的访问控制列表的方法
Mar 08 Python
python实现矩阵和array数组之间的转换
Nov 29 Python
基于python读取.mat文件并取出信息
Dec 16 Python
Python基础之变量基本用法与进阶详解
Jan 03 Python
python 函数嵌套及多函数共同运行知识点讲解
Mar 03 Python
Python基于jieba, wordcloud库生成中文词云
May 13 Python
解决python中import文件夹下面py文件报错问题
Jun 01 Python
python解析多层json操作示例
Dec 30 #Python
pytorch 求网络模型参数实例
Dec 30 #Python
利用python3 的pygame模块实现塔防游戏
Dec 30 #Python
pytorch 批次遍历数据集打印数据的例子
Dec 30 #Python
python多线程使用方法实例详解
Dec 30 #Python
Python动态声明变量赋值代码实例
Dec 30 #Python
使用pytorch实现可视化中间层的结果
Dec 30 #Python
You might like
php mail to 配置详解
2014/01/16 PHP
PHP实现提取多维数组指定一列的方法总结
2019/12/04 PHP
优化JavaScript脚本的性能的几个注意事项
2006/12/22 Javascript
页面中iframe相互传值传参
2009/12/13 Javascript
jQuery 拖动层(在可视区域范围内)
2012/05/24 Javascript
jQuery Trim去除字符串首尾空字符的实现方法说明
2014/02/11 Javascript
利用jquery写的左右轮播图特效
2014/02/12 Javascript
javascript实现的一个随机点名功能
2014/08/26 Javascript
jquery通过load获取文件的内容并跳到锚点的方法
2015/01/29 Javascript
基于jQuery实现的菜单切换效果
2015/10/16 Javascript
JS实现网页上随滚动条滚动的层效果代码
2015/11/04 Javascript
vue2.0模拟锚点的实例
2018/03/14 Javascript
react中实现搜索结果中关键词高亮显示
2018/07/31 Javascript
vue拖拽组件 vuedraggable API options实现盒子之间相互拖拽排序
2019/07/08 Javascript
详解NodeJs项目 CentOs linux服务器线上部署
2019/09/16 NodeJs
python在命令行下使用google翻译(带语音)
2014/01/16 Python
Python实现Const详解
2015/01/27 Python
Python使用multiprocessing创建进程的方法
2015/06/04 Python
Python实现计算最小编辑距离
2016/03/17 Python
在Django中进行用户注册和邮箱验证的方法
2016/05/09 Python
Django 导出 Excel 代码的实例详解
2017/08/11 Python
Python中的单行、多行、中文注释方法
2018/07/19 Python
用python3教你任意Html主内容提取功能
2018/11/05 Python
django项目登录中使用图片验证码的实现方法
2019/08/15 Python
python 函数嵌套及多函数共同运行知识点讲解
2020/03/03 Python
基于python实现地址和经纬度转换
2020/05/19 Python
以实惠的价格轻松租车,免费取消:Easyrentcars
2019/07/16 全球购物
新西兰第一的行李箱网站:luggage.co.nz
2019/07/22 全球购物
印度第一网上礼品店:IGP.com
2020/02/06 全球购物
SHEIN美国:购买时髦的女性服装
2020/12/02 全球购物
创业计划书中要认真思考的问题
2013/12/28 职场文书
出国留学介绍信
2014/01/13 职场文书
员工拓展培训方案
2014/02/15 职场文书
竞选大学学委演讲稿
2014/09/13 职场文书
考试没考好检讨书(精选篇)
2014/11/16 职场文书
2015年医院工作总结范文
2015/04/09 职场文书