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 24 Python
Python实现基于HTTP文件传输实例
Nov 08 Python
用Python实现一个简单的能够上传下载的HTTP服务器
May 05 Python
python使用threading获取线程函数返回值的实现方法
Nov 15 Python
pandas groupby 分组取每组的前几行记录方法
Apr 20 Python
python通过伪装头部数据抵抗反爬虫的实例
May 07 Python
python 实现登录网页的操作方法
May 11 Python
Python使用sqlalchemy模块连接数据库操作示例
Mar 13 Python
Django之模板层的实现代码
Sep 09 Python
如何通过Python3和ssl实现加密通信功能
May 09 Python
python中tab键是什么意思
Jun 18 Python
Django实现drf搜索过滤和排序过滤
Jun 21 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 表单提交大量数据发生丢失的解决方法
2014/03/03 PHP
php 变量引用与变量销毁机制详细介绍
2016/12/05 PHP
YII框架http缓存操作示例
2019/04/29 PHP
基于PHP实现发微博动态代码实例
2020/12/11 PHP
仿校内登陆框,精美,给那些很厉害但是没有设计天才的程序员
2008/11/24 Javascript
jquery tools 系列 scrollable(2)
2009/09/06 Javascript
juqery 学习之三 选择器 简单 内容
2010/11/25 Javascript
Js获取数组最大和最小值示例代码
2013/10/29 Javascript
javascript版的in_array函数(判断数组中是否存在特定值)
2014/05/09 Javascript
JavaScript将取代AppleScript?
2014/09/18 Javascript
javascript实现全角与半角字符的转换
2015/01/07 Javascript
jQuery仿Flash上下翻动的中英文导航菜单实例
2015/03/10 Javascript
jQuery实现不断闪烁文字的方法
2015/05/15 Javascript
探析浏览器执行JavaScript脚本加载与代码执行顺序
2016/01/12 Javascript
js实现多图左右切换功能
2016/08/04 Javascript
微信JS-SDK自定义分享功能实例详解【分享给朋友/分享到朋友圈】
2016/11/25 Javascript
Bootstrap路径导航与分页学习使用
2017/02/08 Javascript
javascript 跨域问题以及解决办法
2017/07/17 Javascript
vue-cli项目中使用echarts图表实例
2018/10/22 Javascript
微信小程序实现左滑修改、删除功能
2020/10/19 Javascript
[00:44]华丽开场!DOTA2勇士令状带来全新对阵画面
2019/05/15 DOTA
Python实现将一个正整数分解质因数的方法分析
2017/12/14 Python
详解将Pandas中的DataFrame类型转换成Numpy中array类型的三种方法
2019/07/06 Python
Python利用matplotlib做图中图及次坐标轴的实例
2019/07/08 Python
PyQt5中多线程模块QThread使用方法的实现
2020/01/31 Python
判断Threading.start新线程是否执行完毕的实例
2020/05/02 Python
美国第一个网上卖鞋零售商:OnlineShoes.com
2017/09/24 全球购物
Yummie官方网站:塑身衣和衣柜必需品
2019/10/29 全球购物
字符串str除首尾字符外的其他字符按升序排列
2013/03/08 面试题
介绍一下如何利用路径遍历进行攻击及如何防范
2014/01/19 面试题
文员个人求职自荐信
2013/09/21 职场文书
机电工程专业应届生求职信
2013/10/03 职场文书
保护母亲河倡议书
2014/04/14 职场文书
2014年教师党员公开承诺书
2014/05/28 职场文书
个人剖析材料范文
2014/09/30 职场文书
党员年度个人总结
2015/02/14 职场文书