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')
相关推荐
OBiO201314 分钟前
Cell | 突破AAV载体容量限制!路中华/姜玉武/刘太安团队开发AAVLINK系统实现大基因递送
笔记
风之所往_28 分钟前
Python 3.0 新特性全面总结
python
2401_8822737230 分钟前
如何在 CSS 中正确加载本地 JPG 背景图片
jvm·数据库·python
Lucas_coding1 小时前
【Claude Code Router】 Claude Code 兼容 OpenAI 格式 API, Claude code 接入本地部署模型
人工智能·python
测试员周周1 小时前
【AI测试系统】第5篇:从 Archon 看 AI 工程化落地:为什么"确定性编排+AI 弹性智能"是终局?
人工智能·python·测试
智者知已应修善业1 小时前
【51单片机2个按键控制流水灯运行与暂停】2023-9-6
c++·经验分享·笔记·算法·51单片机
sakiko_1 小时前
UIKit学习笔记5-使用UITableView制作聊天页面
笔记·学习·swift·uikit
大飞记Python2 小时前
【2026更新】Python基础学习指南(AI版)——04数据类型
开发语言·人工智能·python
Alice-YUE2 小时前
【js高频八股】防抖与节流
开发语言·前端·javascript·笔记·学习·ecmascript
Hello eveybody3 小时前
介绍一下背包DP(Python)
开发语言·python·动态规划·dp·背包dp