Django 笔记3 – URL
Django 系列笔记是笔者学习、实践使用 Django 的相关笔记,大量参考了知了课堂的《Django零基础到项目实战》教程。
参考文档:
Django官方文档(英文)
Django 中文文档
一、URL
1、URL
URL 是 Uniform Resource Locator的简写,统一资源定位符。对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。
2、URL 格式
scheme://host:port/path/?query-string=xxx#anchor
- scheme:访问的协议,一般为http或者https以及ftp等
- host:主机名,域名,比如www.baidu.com
- port:端口号,当你访问一个网站的时候,浏览器默认使用80端口。
- path:查找路径,比如:www.jianshu.com/trending/now ,后面的 trending/now 就是path
- query-string:查询字符串,比如:www.baidu.com/s?wd=python ,后面的 wd=python 就是查询字符串。
- anchor:锚点,前端页面定位标记
- URL中的所有字符都是ASCII字符集,如果出现非ASCII字符,比如中文,浏览器会进行编码再进行传输
二、URL 分发
1、URL 映射配置:在 urls.py 的 urlpatterns 列表中配置
# 如果需要配置 URL 映射,需要导入相关的视图文件
from front import views
urlpatterns = [
# 默认的 URL 映射,后台管理入口
# 如果只有默认的 URL 映射,Django 会提供一个默认的主页
path('admin/', admin.site.urls),
# 自己配置 URL 映射,即把首页映射到,并且可以给该 URL 取个别名
path('', views.index, name='index'),
]
2、URL 中添加参数
url 中包含了一些参数需要动态调整,比如获取某本书的url。
path 中带参数:
# url 格式 .../book/book_id/
---------------------------------------------
# url 映射
# 根据传入的 id 查找书本,格式<param>
path('book/<book_id>/', views.book_detail)
# 可以设置参数的数据类型,格式<type:param>,type 可以是 int、str 等
path('book/<int:book_id>/', views.book_detail)
----------------------------------------------
# 对应的视图函数
# 函数中必须有 book_id 这个参数,且必须和 url 中的名称一样
#
def book_detail(request,book_id):
# 可以根据 book_id 进行数据库查询后返回具体的内容
text = "这本书是:%s" % book_id
return HttpResponse(text)
query-string 中带参数:
# url 格式 .../book/detail/?id=1
---------------------------------------------
# url 映射 path('book/detail/', views.book_detail)
----------------------------------------------
# 对应的视图函数
def book_detail(request):
# 获取查询字符串中的参数
book_id = request.GET.get("id")
text = "这本书是:%s" % book_id
return HttpResponse(text)
默认参数:
# url 映射
# 两个 path 映射到同一个视图函数
urlpatterns = [
path('book/', views.book_detail),
path('book/<int:num>/', views.book_detail),
]
----------------------------------------------
# 视图函数
# 视图函数中可以为 num 指定默认参数,这样当 url 中没有 num 这个参数时会使用默认值
def book_detail(request, num=1):
3、URL 映射包含 app 的 urls 模块
项目的 urls 配置:
from django.urls import path,include
urlpatterns = [
# 即把包含 index/ 的 URL,都映射到 index 模块中的 urls.py 中的 urlpatterns
# URL 不需要写主机名和端口号
path('index/',include("index.urls"))
]
app 的 urls 配置:
from django.urls import path,include
urlpatterns = [
# app 中的 urls.py 中的 urlpatterns 的 path 直接从项目映射的 url 后面开始
# 例如:下面的 path 映射的是 'index/first/
path('first/', views.first)
]
三、URL 匹配
1、path 函数
path(route,view,name=None,kwargs=None)
- route参数:url的匹配规则。这个参数中可以指定url中需要传递的参数,比如在访问文章详情页的时候,可以传递一个id。传递参数是通过 <> 尖括号来进行指定的。并且在传递参数的时候,可以指定这个参数的数据类型,比如文章的id都是int类型,那么可以这样写< int:id>,以后匹配的时候,就只会匹配到id为int类型的url,而不会匹配其他的url,并且在视图函数中获取这个参数的时候,就已经被转换成一个 int 类型了。常用的类型:
- str:非空的字符串类型。默认的转换器。但是不能包含斜杠。
- int:匹配任意的零或者正数的整形。到视图函数中就是一个int类型。
- slug:由英文中的横杠-,或者下划线_连接英文字符或者数字而成的字符串。
- uuid:匹配uuid字符串。
- path:匹配非空的英文字符串,可以包含斜杠。
- view参数:可以为一个视图函数或者是类视图.as_view()或者是django.urls.include()函数的返回值。
- name参数:这个参数是给这个url取个名字的,这在项目比较大,url 比较多的时候用处很大。
- kwargs参数:有时候想给视图函数传递一些额外的参数,就可以通过kwargs参数进行传递。这个参数接收一个字典。传到视图函数中的时候,会作为一个关键字参数传过去。
path('blog/<int:xx>/', views.xxx, {'key': 'value'})
2、re_path 函数:
re_path 使用正则表达式进行 url 匹配,re_path 的 route参数可以为一个正则表达式
# re_path 函数
re_path(route,view,name=None,kwargs=None)
# route 参数格式
r'.../(?P<year>[0-9]{4})/'
- r:表示这个字符串是一个原生字符串
- ?P< name>:正则表达式的名称为 name
- <>后面:正则表达式
三、URL 反转
已知视图函数,反转得到它的 url
1、url反转:reverse()
# 格式
reverse('命名空间')
# 如果有应用/实例命名空间,应当指明
reverse('命名空间:命名空间')
# 如果 url 中需要传递参数,可以通过kwargs来传递参数
reverse('命名空间:命名空间', kwargs={'key':value})
# reverse 反转url 的时候不区分GET请求和POST请求
# 只能手动添加查询字符串的参数
reverse('命名空间:命名空间') + "?q=xxx/"
2、自定义 URL 转换器
步骤:
- 定义一个类
- 在类中定义一个属性 regex 用来保存 url 转换器规则的正则表达式
- 实现 to_python(self,value) 方法,将 url 中的值转换后传给视图函数
- 实现 to_url(self,value) 方法,url 反转时将传进来的参数转换后,拼接成一个正确的url
- 将定义好的转换器,注册到django中
示例:
# 匹配四个数字年份的 url 转换器
# 1. 定义一个类
class FourDigitYearConverter:
# 2. 定义一个正则表达式
regex = '[0-9]{4}'
# 3. 定义to_python方法
def to_python(self, value):
return int(value)
# 4. 定义to_url方法
def to_url(self, value):
return '%04d' % value
# 5. 注册到django中
from django.urls import register_converter
register_converter(converters.FourDigitYearConverter, 'convert')
# 使用
path('book/<convert:year>/'
GOOD LUCK!