侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Django 路由层URLconf的实现

框架(架构)  /  管理员 发布于 7年前   187

分组

分组的目的:让服务端获得url中的具体数据,通过分组,把需要的数据按函数传参的方式传递给服务器后台

1-无名分组

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

# app01/urls.pyfrom django.urls import path, re_pathfrom app01 import viewsapp_name = "app01"urlpatterns = [  path("login/", views.login, name="Log"),  re_path(r"articles/([0-9]{4})/([0-9]){2}/", views.articles),]
# app01/views.pydef articles(request, year, month ):  print(year, month)  return HttpResponse(year+"-"+month)

2-有名分组

在更高级的用法中,可以使用命名的正则表达式组来捕获URL 中的值并以关键字 参数传递给视图。

在Python 正则表达式中,命名正则表达式组的语法是(?P<name>),其中name 是组的名称,下面是以上URLconf 使用命名组的重写。

# app01/urls.pyfrom django.urls import path, re_pathfrom app01 import viewsapp_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.pydef articles(request, month, year ):  print(year, month)  return HttpResponse(year+"-"+month)

分发

分发的目的:解决一个django项目中因为存在多个应用app导致project下面的urls臃肿和分配混乱的问题

分发的具体操作流程是:

step1:项目文件下的urls.py,使用include()

# project/urls.pyfrom django.contrib import adminfrom django.urls import path, includeurlpatterns = [  path('admin/', admin.site.urls),  path(r"app01/", include("app01.urls")),]

step2:app下的具体url

# app01/urls.pyfrom django.urls import pathfrom app01 import viewsurlpatterns = [  path("login/", views.login),]

step3:视图函数render时模板路径前缀

# app01/views.pyfrom 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.pyfrom django.urls import pathfrom app01 import viewsurlpatterns = [  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.pyfrom django.shortcuts import renderfrom 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.pyfrom django.contrib import adminfrom django.urls import path, includeurlpatterns = [  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.pyfrom django.urls import pathfrom app01 import viewsapp_name = "app01"urlpatterns = [  path("login/", views.login, name="Log"),]
# app01/views.py(需要时设置)from django.shortcuts import renderfrom 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_pathfrom app01 import viewsapp_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_converterfrom app01 import views, my_convertersregister_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")

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


  • 上一条:
    Django框架之中间件MiddleWare的实现
    下一条:
    Django框架教程之中间件MiddleWare浅析
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Filament v3.1版本发布(0个评论)
    • docker + gitea搭建一个git服务器流程步骤(0个评论)
    • websocket的三种架构方式使用优缺点浅析(0个评论)
    • ubuntu20.4系统中宿主机安装nginx服务,docker容器中安装php8.2实现运行laravel10框架网站(0个评论)
    • phpstudy_pro(小皮面板)中安装最新php8.2.9版本流程步骤(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2018-05
    • 2020-02
    • 2020-03
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-11
    • 2021-03
    • 2021-09
    • 2021-10
    • 2021-11
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-08
    • 2023-08
    • 2023-10
    • 2023-12
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客