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')
相关推荐
蒸蒸yyyyzwd1 分钟前
邓明 Agent 系统面试-意图识别学习笔记
笔记·学习
武天旭2 小时前
AI安全--AI大模型的毒性偏见与安全对齐实践
人工智能·python·深度学习
视觉小萌新3 小时前
AI Class 3 · Chapter 2-3:函数、异常、文件读写+JSON / JSONL 读写(小白版)
人工智能·python·json
Zhao-Jichao3 小时前
AI Prompting for Everyone 课程笔记 - P21 总结 Conclusion
人工智能·笔记
欢欢李3 小时前
【LTE L3 笔记 05】LTE同步信号
笔记·无线通信·物理层·lte·空口协议
小小张说故事4 小时前
Python 的 obj.x 到底按什么顺序找?拆开数据描述符、实例字典和 __getattr__ 那条优先级链
python
用户11481867894845 小时前
水印的实现方式逻辑
前端·python
La Pulga5 小时前
【FreeRTOS源码学习笔记】空闲任务与阻塞延时
笔记·mcu·学习·嵌入式·freertos·实时操作系统
贾公子5 小时前
从单条内容到账号维度——AIGC 风险评分的工程实现
后端·python
蒸蒸yyyyzwd5 小时前
秋招学习笔记 day106
笔记·学习