Django 路由层URLconf的实现

Django 路由层URLconf的实现,第1张

概述Django 路由层URLconf的实现 分组 分组的目的:让服务端获得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, ...

分组

分组的目的:让服务端获得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_path(r"articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2}/)",]

捕获的值作为关键字参数而不是位置参数传递给视图函数

# 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/",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",)))  return render(request,"app01/login.HTML")

命名空间

命名空间要配合反向解析使用,当存在多个app,url的name冲突时,需要指定该name的命名空间

# project/urls.pyfrom django.contrib import adminfrom django.urls import path,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/",]
# 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/",# re_path(r"articles/(?P<year>[0-9]{4})/",path("articles/<int:year>/<int:month>/",]

step2: app01/vIEws.py

def articles(request,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/",# path("articles/<int:year>/<int:month>/",path("books/<year:y>",vIEws.books),]

step3: app01/vIEws.py

def books(request,y):  print(y,type(y))  return httpResponse("ok,books")

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

总结

以上是内存溢出为你收集整理的Django 路由层URLconf的实现全部内容,希望文章能够帮你解决Django 路由层URLconf的实现所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1199423.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存