Django 路由层URLconf的实现

作者:liuxu2019 时间:2021-01-18 17:05:13 

分组

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

来源:https://www.cnblogs.com/liuxu2019/p/12116778.html

标签:Django,路由层,URLconf
0
投稿

猜你喜欢

  • ASP使用FSO组件生成HTML静态页面

    2007-10-15 12:19:00
  • 用tensorflow构建线性回归模型的示例代码

    2022-04-12 03:41:47
  • python如何将图片转换素描画

    2022-05-26 23:17:49
  • 基于python框架Scrapy爬取自己的博客内容过程详解

    2021-12-21 06:39:30
  • 基于python实现垂直爬虫系统的方法详解

    2023-11-17 13:33:38
  • python3字符串输出常见面试题总结

    2021-01-13 08:39:23
  • Python线程之同步机制实际应用场景举例说明

    2023-06-10 13:57:40
  • python网络编程学习笔记(四):域名系统

    2021-07-15 10:16:49
  • 使用TensorFlow实现SVM

    2023-04-27 00:44:49
  • Python利用pywin32库实现将PPT导出为高清图片

    2023-10-01 22:59:45
  • 解决asp中ADODB.Stream 0x800A0C93 错误

    2008-01-08 19:28:00
  • Django框架静态文件处理、中间件、上传文件操作实例详解

    2021-03-07 14:31:04
  • Bootstrap Paginator分页插件使用方法详解

    2023-09-05 23:08:42
  • sqlserver 存储过程带事务 拼接id 返回值

    2012-11-30 20:06:39
  • PHP chunk_split()函数讲解

    2023-06-09 13:54:44
  • django 解决manage.py migrate无效的问题

    2021-08-18 02:28:51
  • python中关于对super()函数疑问解惑

    2022-08-10 04:11:48
  • 关于ASP中脚本执行顺序的讲解

    2008-11-04 12:02:00
  • Python数据分析之 Matplotlib 折线图绘制

    2023-12-05 02:18:13
  • Django如何创作一个简单的最小程序

    2022-09-04 04:57:28
  • asp之家 网络编程 m.aspxhome.com