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文件操作相关知识点总结整理
Feb 22 Python
Python中的连接符(+、+=)示例详解
Jan 13 Python
利用python实现xml与数据库读取转换的方法
Jun 17 Python
Python利用itchat对微信中好友数据实现简单分析的方法
Nov 21 Python
python pandas生成时间列表
Jun 29 Python
Numpy与Pytorch 矩阵操作方式
Dec 27 Python
python3通过udp实现组播数据的发送和接收操作
May 05 Python
在python中使用pyspark读写Hive数据操作
Jun 06 Python
使用Python文件读写,自定义分隔符(custom delimiter)
Jul 05 Python
python文件操作seek()偏移量,读取指正到指定位置操作
Jul 05 Python
python 基于opencv去除图片阴影
Jan 26 Python
pandas中DataFrame检测重复值的实现
May 26 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使用GeoIP库实例
2014/06/27 PHP
php实现编辑和保存文件的方法
2015/07/20 PHP
在Yii2中使用Pjax导致Yii2内联脚本载入失败的原因分析
2016/03/06 PHP
PHP+iframe图片上传实现即时刷新效果
2016/11/18 PHP
基于jQuery实现复选框的全选 全不选 反选功能
2014/11/24 Javascript
NodeJs基本语法和类型
2015/02/13 NodeJs
JavaScript更改原始对象valueOf的方法
2015/03/19 Javascript
深入了解JavaScript中的Symbol的使用方法
2015/07/28 Javascript
Markdown与Bootstrap相结合实现图片自适应属性
2016/05/04 Javascript
jQuery height()、innerHeight()、outerHeight()函数的区别详解
2016/05/23 Javascript
js控住DOM实现发布微博效果
2016/08/30 Javascript
Angular 4依赖注入学习教程之简介(一)
2017/06/04 Javascript
基于原生js运动方式关键点的总结(推荐)
2017/10/01 Javascript
vue 路由嵌套高亮问题的解决方法
2018/05/17 Javascript
Vuejs+vue-router打包+Nginx配置的实例
2018/09/20 Javascript
Vue resource三种请求格式和万能测试地址
2018/09/26 Javascript
使用javascript做时间倒数读秒功能的实例
2019/01/23 Javascript
简单说说如何使用vue-router插件的方法
2019/04/08 Javascript
jquery实现直播视频弹幕效果
2020/02/25 jQuery
15个简单的JS编码标准让你的代码更整洁(小结)
2020/07/16 Javascript
python友情链接检查方法
2015/07/08 Python
简单谈谈python中的语句和语法
2017/08/10 Python
在python3环境下的Django中使用MySQL数据库的实例
2017/08/29 Python
详解Django+uwsgi+Nginx上线最佳实战
2019/03/14 Python
Python如何处理大数据?3个技巧效率提升攻略(推荐)
2019/04/15 Python
python3.4+pycharm 环境安装及使用方法
2019/06/13 Python
Python符号计算之实现函数极限的方法
2019/07/15 Python
如何获取Python简单for循环索引
2019/11/21 Python
Python如何计算语句执行时间
2019/11/22 Python
使用Tkinter制作信息提示框
2020/02/18 Python
CSS3系列教程:背景图片(背景大小和多背景图) 应用说明
2012/12/19 HTML / CSS
充分就业社区汇报材料
2014/05/07 职场文书
2014乡镇党政班子四风问题思想汇报
2014/09/14 职场文书
领导干部作风建设自查报告
2014/10/23 职场文书
2015年全国爱眼日活动小结
2015/02/27 职场文书
python tkinter Entry控件的焦点移动操作
2021/05/22 Python