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')
相关推荐
雪碧聊技术几秒前
爬虫是什么?
大数据·爬虫·python·数据分析
冷雨夜中漫步4 分钟前
高级系统架构师笔记——系统质量属性与架构评估(1)软件系统质量属性
笔记·架构·系统架构
FL16238631296 分钟前
[yolov11改进系列]基于yolov11使用fasternet_t0替换backbone用于轻量化网络的python源码+训练源码
python·yolo·php
Freshman小白10 分钟前
python算法打包为docker镜像(边缘端api服务)
python·算法·docker
岁岁岁平安14 分钟前
python mysql-connector、PyMySQL基础
python·mysql·pymysql
oe101943 分钟前
好文与笔记分享 A Survey of Context Engineering for Large Language Models(中)
人工智能·笔记·语言模型·agent开发
铁锹少年1 小时前
当多进程遇上异步:一次 Celery 与 Async SQLAlchemy 的边界冲突
分布式·后端·python·架构·fastapi
梨轻巧1 小时前
pyside6常用控件:QCheckBox() 单个复选框、多个复选框、三态模式
python
寒秋丶1 小时前
Milvus:集合(Collections)操作详解(三)
数据库·人工智能·python·ai·ai编程·milvus·向量数据库
寒秋丶1 小时前
Milvus:Schema详解(四)
数据库·人工智能·python·ai·ai编程·milvus·向量数据库