Django 路由层URLconf的实现

 更新时间:2019年12月30日 10:37:19   作者:liuxu2019  
这篇文章主要介绍了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, 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探索之创建二叉树

    这篇文章主要介绍了Python探索之创建二叉树,Python的相关内容,小编是初窥门径。这里分享给大家一些简单知识,供需要的朋友参考。
    2017-10-10
  • python发送邮件示例(支持中文邮件标题)

    python发送邮件示例(支持中文邮件标题)

    python发送中文邮件示例,支持中文邮件标题和中文邮件内容。支持多附件。根据用户名推测邮件服务器提供商
    2014-02-02
  • 提升Python代码质量巧妙整理包引入顺序

    提升Python代码质量巧妙整理包引入顺序

    在Python编程中,优化导入包的顺序可以提高代码的可读性、可维护性和性能,一个良好的导入顺序不仅使代码更易于理解,还可以帮助减少潜在的循环依赖和提高导入速度,本文将介绍如何快速、有效地优化Python导入包的顺序,并提供丰富的示例代码以帮助更好地理解
    2024-01-01
  • python-pandas创建Series数据类型的操作

    python-pandas创建Series数据类型的操作

    这篇文章主要介绍了python-pandas创建Series数据类型的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • python将时分秒转换成秒的实例

    python将时分秒转换成秒的实例

    今天小编就为大家分享一篇python将时分秒转换成秒的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • python flask框架实现传数据到js的方法分析

    python flask框架实现传数据到js的方法分析

    这篇文章主要介绍了python flask框架实现传数据到js的方法,结合实例形式分析了前端数据序列化及后台Flask交互数据返回相关操作技巧,需要的朋友可以参考下
    2019-06-06
  • python文件读取和导包的绝对路径、相对路径详解

    python文件读取和导包的绝对路径、相对路径详解

    每次在读或写文件时,获取脚本文件的绝对路径和相对路径时很容易搞混,下面这篇文章主要给大家介绍了关于python文件读取和导包的绝对路径、相对路径的相关资料,需要的朋友可以参考下
    2022-04-04
  • pytorch多进程加速及代码优化方法

    pytorch多进程加速及代码优化方法

    今天小编就为大家分享一篇pytorch多进程加速及代码优化方法。具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • python不支持i++运算原理实例解析

    python不支持i++运算原理实例解析

    这篇文章主要为大家介绍了python不支持 i++运算原理实例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-02-02
  • python 6.7 编写printTable()函数表格打印(完整代码)

    python 6.7 编写printTable()函数表格打印(完整代码)

    这篇文章主要介绍了python 6.7 编写一个名为printTable()的函数 表格打印,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03

最新评论