Django 3 URL编写

6 篇文章 0 订阅
6 篇文章 0 订阅

URL (Uniform Resource Locator,统一资源定位符)是对可以从互联网上得到的 资源位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的 URL, 用于指出文件的路径位置。简单地说,URL 就是常说的网址,每个地址代表不同的网页, 在 Django 中, URL 也称为 URLconfo。

URL 编写规则

在每个 App 中设置独立的静态资源和模板文件夹并添加一个空白内容的 urls.py 文件,项目结构如图所示。

创建后的目录

在 App 里添加 urls.py 是将属于 App 的 URL 都写入到该文件中,而项目根目录 的 urls.py 是将每个 App 的 urls.py 统一管理。当程序收到用户请求的时候, 首先在 根目录的 urls.py 查找该 URL 是属于那个 App,然后再从 App 的 urls.py 找到具体的 URL 信息。在根目录的 urls.py 编写 URL 规则:

# 根目录的urls.py
from django.contrib import admin
from django.urls import path

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('index.urls')),
]

上述代码设定了两个 URL 地址, 分别是 Admin 站点管理和首页地址。 其中 Amdin 站点管理是在创建项目时已自动生成, 一般情况下无须更改, urls.py 的代码解释如下。

  • from django.contrib import admin: 导入 Admin 功能模块。
  • from django.urls import path,include: 导入 URL 编写模块。
  • urlpattems: 整个项目 的 URL 集合,每个元素代表一条 URL 信息。
  • path( ‘ admin/' , admin.site.urls): 设定 Admin 的 URL。 'admin/' 代表127.0.0.1 :8000/admin 地址信息, admin 后面的斜杠走路径分隔符; admin.site. urls 是 URL 的处理函数,也称为视图函数。
  • path(' ' ,include(' index.urls' )): URL 为空,代表为网站的域名, 即127.0.0.1:8000, 通常是网站的首页 ; include 将该 URL 分发给index 的 urls.py 处理。

由于首页的地址分发给 index 的 urls.py 处理,因此下一步需要对 index 的 urls.py 编写 URL 信息,代码如下:

# index的urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.index),
]

上述代码导入了同一目录下的 views.py 文件, 该文件用于编 写视图函数, 处理 URL 请求信息并返回网页内容给用户。因此, 在 views.py 中编写 index 函数的处理过程,代码如下:

# index的view.py
from django.http import HttpResponse
def index(request):
    return HttpResponse('Hello World')

index 函数必须设置参数 request,该参数代表当前用户 的请求对象, 该对象包含用户名、请求内容和请求方式等信息,视图函数执行完成后必须使用 return 将 处理结果返回,否则程序会抛出异常信息。

 

带变量的URL:

在日常开发过程中,有时候一个 URL 可以代表多个不同的页面, 如编写带有日期的 URL,若根据前面的编写方式,按一年计算,则需要开发者编写 365 个不同的URL才能实现,这种做法明显是不可取的。 因此,Django。 在编写 URL 时,可以对 URL 设置变量值,使 URL 具有多样性。

URL 的变量类型有字符类型、整型、 slug 和 uuid, 最为常用的是字符类型和整型。 各个类型说明如下。

  • 字符类型:匹配任何非空字符串,但不含斜杠。 如果没有指定类型,默认使 用该类型 。
  • 整型 : 匹配 0 和正整数。
  • slug: 可理解为注释、后级或附属等概念,常作为 URL 的解释性字符。 可匹 自己任何 ASCII 字符以及连接符和下画线, 能使 URL 更加清晰易懂。 比如网页的标题是 "13 岁的孩子",其 URL 地址可以设置为 "13-sui-demhai-zi"。
  • uuid: 匹配一个 uuid 格式的对象。 为了防止冲突,规定必须使用破折号并且所有字母必须小写,例如 075194d3-6885-417e-a8a8-6c931e2720。

根据上述变量类型,在 index 的 urls.py 里添加带有字符类型、 整型和 slug 的 URL 地址信息,代码如下:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index),
    path('<year>/<int:month>/<slug:day>', views.mydate),
]

在 URL 中使用变量符号"< >"可以为 URL 设置变量。在括号里面以冒号划分为两部分, 前面代表的是变量的数据类型,后面代表的是变量名 , 变量名可自行命名 。 上述代码对新增的 URL 设置了三个变量值, 分别是 <year>、 <int:month> 和 <slug:day> , 变量说明如下。

  • <year>: 交量名为 year, 数据格式为字符类型,与 <str:year> 的含义一样。
  • <int:month>: 交量名为 month, 数据格式为整型 。
  • <slug:day>: 交量名为 day,数据格式为 slugo

在 views-py 中编写视图函数 mydate 的处理方法,代码如下:
 

def mydate(request, year, month, day):
    return HttpResponse(str(year) + '/' + str(month) + '/' + str(day))

 为了进 一步规范日期格式,可以使用正则表达式限制 URL 的可变范围。 正则表达式的 URL 编写规则如下:

urlpatterns = [
    path('', views.index),
    # path('<year>/<int:month>/<slug:day>', views.mydate),
    re_path(r'^(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})', views.mydate)
]

在 URL 中引入正则表达式, 首先导入 re_path 功能模块,正则表达式的作用是 对 URL 的变量进行截取与判断,以小括号表示, 每个小括号的前后可以使用斜杠或 者其他字符将其分隔。 以上述代码为例, 分别将变量 year、 month 和 day 以斜杠分割, 每个变量以一个小括号为单位, 在小括号内,可分为三部分,以(?P<year>[0-9]{4})为例进行介绍。

值得注意的是, 如果 URL 的末端使用正则表达式, 那么在该 URL 的末端应加上 斜杠或者其他字符,否则正则表达式无法生效。

在配置正则表达式时需要注意添加 r 和 ^ 符号。

 

设置参数 name

除了在 URL 里面设置变量之外, Django 还可以对 URL 进行命名。

在 index 的 urls.py、 views.py 和模板 myyear.html 中添加 以下代码:
 

# 在urls.py新增url路径
re_path(r'^(?P<year>[0-9]{4})', views.myyear, name='myyear')

# 在views.py中新增
def myyear(request, year):
    return HttpResponse(request, 'myyear.html')

# 在myyear.html中新增
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div><a href="/2018.html">2018 old Archive</a></div>
<div><a href="{% url 'myyear' 2018 %}">2018 Archive</a></div>
</body>
</html>
  1. 当用户访问该 URL 时,项目根据 URL 信息选择视图函数 myyear 处理, 并将该 URL 命名为 myyear
  2. 视图函数 myyear 将模板 myyear.html 作为响应内容并生成相应的网页返回给用户 。
  3. 在模板 myyear.html 中分别设置两个标签 a, 虽然两个标签 a 的 href属性值 的写法有所不同 , 但实质上两者都指向命名为 myyear 的 URL 地址信息。
  4. 第二个标签 a 的 href为{% url 'myyear' 2018 %},这是 Django 的模板语法, 模板语法以{%%}表示。其中, url  'myyear ' 是将命名为 myyear 的 URL 地址信息作 为 href属性值; 2018 是该 URL 的变量 year,若 URL 没有设置变量值,则无须添加。

在以往,大多数开发者都是采用第一种方法在模板上设置每个标签 a 的 href属性 值,如果 URL 地址信息发生变更,就要修改每个标签 a 的 href属性值,这种做法不 利于 URL 的变更和维护。而在 URL 中设置参数 name,只要参数 name 的值不变,无 论 URL 地址信息如何修改都无须修改模板中标签 a 的 href属性值。

设置额外参数

除了参数 name 之外,还有一种参数类型是以字典的数据类型传递的,该参数没 有具体命名,只要是字典形式即可,而且该参数只能在视图函数中读取和使用。其代码如下:

# 参数为字典的URL
re_path(r'^dict/(?P<year>[0-9]{4})/', views.myyear_dict, {'month': '05'}, name='myyear_dict')

# 参数为字典的 URL 的视图函数
def myyear_dict(request, year, month):
    return render(request, 'myyear_dict.html', {'month': month})

# 在 templates 文件夹添加 myyear_dict.html 文件: 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<a href="{% url 'myyear_dict' 2018 %}">2018 {{ month }}</a>
</body>
</html>


上述代码分别从 URL、视图函数和 HTML 模板来说明 URL 额外参数的具体作用, 说明如下:

  • 除了在 URL 地址信息中设置参数 name 之外,还加入了参数{'month': '05' } ,该参数用于设置参数 month,参数值为 05。
  • 然后视图函数 myyear_dict 获取了变量 year 和参数 month,前者设亘在 URL 地址中,而后者在 URL 地址外。
  • 最后视图函数将参数 month 的值传递到 HTML 模板并生成 HTML 网页返回给 用户 。
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值