Django笔记(三):路由urls

Django中视图的作用是在链接与视图函数之间做映射。创建完Django项目后,同名文件夹下的urls.py为项目的总路由(/project/project/urls.py):

python 复制代码
from django.contrib import admin
from django.urls import path

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

其中包含一条路由"admin",映射的视图函数为admin.site.urls。当访问//localhost/admin/时,会打开Django自带的后台管理界面。

配置路由

创建app1,并在views.py中编写一个视图函数,如:

python 复制代码
from django.shortcuts import render

# Create your views here.
def index(request):
    return render(request, '1/index.html')

视图内容是将index.html模板返回,那如何编写访问index视图的路由呢?修改/project/project/usls.py:

python 复制代码
from django.contrib import admin
from django.urls import path
from app1 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/', views.index, name="app1_index"),
]

在urlpatterns中添加路由规则即可,path(路由,视图函数,别名)。别名建议使用"app_func"的起名方式,避免app间url冲突。(别名在重定向时有一定作用)

路由包含

一个项目可能会包含多个app,每个app又包含多个功能,每个功能又有多个路由,如果将所有路由映射全部放在/project/project/urls.py中会显得杂乱,不利于后期扩展。可以通过路由包含逐级配置路由。如项目中有两个app,可通过include进行包含设置:

python 复制代码
from django.contrib import admin
from django.urls import path, include


urlpatterns = [
    path("app1/", include("app1.urls")),
    path("app2/", include("app2.urls")),
    path('admin/', admin.site.urls),
]

app1中urls.py,可以配置app1中的路由:

python 复制代码
from django.urls import path
from app1 import views


urlpatterns = [
    path("index/", views.index),
]

当访问//localhost/app1/index/时,首先会映射到app1/这个路由,之后会将其交给app1的urls路由文件继续进行子路的映射。

函数 include() 允许引用其它 URLconfs。每当 Django 遇到 include() 时,它会截断与此项匹配的 URL 的部分,并将剩余的字符串发送到 URLconf 以供进一步处理。------Django文档

如果app1中有多个功能,可以继续分。app中创建urls文件夹,其下根据不同功能创建子路由文件夹,例如func1和func2,分别在其下创建各功能的路由文件。而app级路由文件则对func1和func2进行子路由的映射。

路由参数

如果我们编写一个博客网站,链接可能是这样的//localhost/abc/1/,表示abc这个人写的第一篇文章,那么第二篇文章链接应该是//localhost/abc/2/,如果每写一篇文章都设置一个路由,那我们的路由文件会及其复杂繁琐。此时,可以将路由的作者文章部分当做一个参数进行路由配置。

(注,这里的参数不是GET请求的参数,是以Django为出发点解析路由的一个概念名词,如果是请求参数,链接应该是//localhost/pages?user=abc&num=1)

python 复制代码
urlpatterns = [
    path('abc/<int:num>', views.index),
]

参数规则<类型 : 名称>,如上一条路由会匹配所有abc后接数字(非负)的路由,并将数组存储在num参数中。

除了int还有str,slug(类似char)和uuid类型,使用方式与int类似。

如果路由过于复杂,可以通过re_path函数进行正则匹配,具体使用方式留给大家去查。

python 复制代码
from django.urls import re_path
from app1 import views

urlpatterns = [
    re_path(r"abc/(?P<num>\d+)", views.index),
]

接收路由参数

视图接收路由参数的方式很简单,增添同名参数即可:

python 复制代码
from django.shortcuts import render

# Create your views here.
def index(request, num):
    print(num)
    return render(request, '1/index.html')
相关推荐
运维开发王义杰7 分钟前
Python: 告别 ModuleNotFoundError, 解决 pipx 环境下 sshuttle 缺少 pydivert 依赖的终极指南
开发语言·python
DanCheng-studio34 分钟前
毕设 基于机器视觉的驾驶疲劳检测系统(源码+论文)
python·毕业设计·毕设
carpell36 分钟前
【语义分割专栏】3:Segnet实战篇(附上完整可运行的代码pytorch)
人工智能·python·深度学习·计算机视觉·语义分割
普宁彭于晏1 小时前
元素水平垂直居中的方法
前端·css·笔记·css3
一只小波波呀1 小时前
打卡第48天
python
m0_637146932 小时前
计算机网络基础总结:TCP/IP 模型、TCP vs UDP、DNS 查询过程
笔记·tcp/ip·计算机网络
zstar-_2 小时前
一套个人知识储备库构建方案
python
Lester_11012 小时前
嵌入式学习笔记 - freeRTOS vTaskPlaceOnEventList()函数解析
笔记·学习
Amo Xiang2 小时前
《100天精通Python——基础篇 2025 第5天:巩固核心知识,选择题实战演练基础语法》
python·选择题·基础语法
江梦寻2 小时前
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
开发语言·后端·python·macos·架构·策略模式