1、路由
1.1、URL路由简介
在Django中URL路由,由成为URL调度器,其作用是完成URL与Python视图函数的映射。
1.2、URL路由位置
路由写在了项目文件下的url.py这个Python文件中,该文件是创建项目时自动创建的。在该文件中,路由定义格式如下:
urlpatterns = [
path('admin/', admin.site.urls),
path('hello/',views.hello),
]
1.3、URL路由三部曲
a.在url.py文件中定义路由,并指定视图函数;
b.定义路由中指定的视图函数,即Python函数
c.通过浏览器进行访问。
1.4、URL路由工作流程
2、path函数
2.1、什么是path函数
path的作用是返回一个元素,以便包含在urlpatterns列表中,该函数需要导入(from django.urls import path),已在创建项目时完成。
2.2、path函数语法结构
path的语法格式如下:
path(route,view,kwargs=None,name=None)#参数含义如下:
route参数是一个匹配URL规则的字符串,当Django在处理请求时,会从urlpatterns的第一项开始,按顺序依次匹配列表中的每一项,直到找到为止。匹配的原则是:匹配到即停止;
view参数是一个视图函数名,视图函数用于处理用户的请求,并且返回响应。视图函数必须将HttpRequest对象作为第一个参数,参数建议一般以request命名。后一节将详细介绍;
kwargs 代表向模板传递的参数,必须在字典(dict);
name 为url命名(在应用中一般以“应用名_配置项名称”命名),以便Django在任意地方可以唯一引用它。
2.3、分布式路由include()函数
在Django中,每个项目的独立业务模块就称为一个应用。在每个应用中可 以包含其相对独立的模板、静态文件、视图函数、路由等。
在Django中创建应用分两步:a、创建:python3 manage.py startapp name(例如:python3 manage.py startapp users);b、注册:在 settings.py 的 INSTALLED_APPS 列表中添加已创建的应用,如:
INSTALLED_APPS = [ # ...
'users.apps.UsersConfig'
]
应用的目录结构有:views.py 指视图函数的处理文件;models.py 指模型类文件;migrations 是数据迁移目录;还需要用户自行创建urls.py 文件,用于存储应用的 路由信息。
分布式路由,仍然写在项目目录下的urls.py中,格式如下:
from django.contrib import admin
from django.urls import path,include
from . import views
urlpatterns = [
path('',views.index),
path('admin/', admin.site.urls),
path('blog/',include('users.urls')),
]
3、路径转换器
3.1、路径转换器简介
Django 中的路径转换器用于捕获 URL 模式中特定部分的值,并将其作为参数传递给视图函数。
3.2、路径转换器的作用
路由系统中通过路径转换器传递参数,需要强调的是:在视图函数中也必须存在同名的参数,以接收路径转换器传递来的参数。
urlpatterns = [ path('user/<int:id>/name/<str:name>',userinfo),
]
对应的视图函数则需要书写成:
from django.http import HttpResponse
def userinfo(request,id,name): ...
...
3.3、路径转换器的分类
主要有以下五种格式:
a、整数,匹配 0 及其他正整数,返回 int <int:parameter_name> ,如:
# urls.py中的代码
def article(request,id):
return HttpResponse('文章详情')
urlpatterns = [ path('article/<int:id>',article),
]
b、字符串,匹配除 / 外的任何非空字符串,直到遇到下个斜线 <str:parameter_name> ,如:
def user(request,username):
return HttpResponse(f"username is: {username}")
urlpatterns = [
path('admin/', admin.site.urls),
path('user/<str:username>',user),
]
c、路径,匹配非空字符串,包括路径分隔符( / ) <path:parameter_name> ;
d、uuid ,匹配 UUID 格式的字符串,其格式为 8-4-4-4-12 <uuid:parameter_name>;
e、slug ,匹配任何的 ASCII 字母,数字、短横线及下划线,<slug:parameter_name>。
4、用re_path()方法正则匹配复杂路由(了解)
路由中的正则表达式的语法格式如下:(?P<name>pattern)其中,那么是匹配的字符串,pattern是要匹配的模式。
常见的正则表达式如下:
正则表达式 | 说明 |
. | 匹配任意单个字符 |
\d | 匹配任意一个数字 |
\w | 匹配字母、数字、下划线 |
* | 匹配0个或者多个字符(如“\d*”代表匹配0个或者多个数字) |
[a-z] | 匹配a~z中任意一个小写字符 |
{1,5} | 匹配1~5个字符 |
代码示例:
urls.py代码:
from django.urls import path, re_path
from app2 import views
urlpatterns = [
re_path('list/(?P<year>\d{4})',views.list),
re_path('page/(?P<page>\d+)&key=(?P<key>\w+)',views.page),
]
第一条路由:接收以“app2/list/”开头,后面跟4位整数
第二条路由:接收以“app2/page/”开头、后面跟任意位整数,且第二个参数可以是字母、数字和下划线
在app2应用的views.py中增加视图函数如下:
def list(request,year):
return HttpResponse(f"今年是:{year}")
def page(request,page,key):
return HttpResponse(f"这是书本的第{page}页,里面的内容是{key}")