首页 > 其他分享 >必备知识点 路由

必备知识点 路由

时间:2024-03-28 20:00:15浏览次数:18  
标签:知识点 views 必备 py urls path login 路由

django必备知识点 路由

1.Django生命周期请求流程图

  • 浏览器>>
  • 发送请求(Http请求) >>
  • web服务网关接口(django默认的wsgiref模块不能承受高并发,最大只有1000左右) >>
  • 中间件 >> 缓存数据库(返回给中间件已经缓存过的数据) >>
  • urls.py(路由层) >>
  • views.py(视图层) >>
  • templates(模板层:存放html静态文件) models.py(模型层:存放假架接数据库)>>
  • 数据库(返回给模型层需要的数据)

2.什么是URL配置(URLconf)

  • URL调度器 | Django 文档 | Django (djangoproject.com)
  • URL配置(URLconf)就像Django 所支撑网站的目录。
    • 它的本质是URL与要为该URL调用的视图函数之间的映射表。
  • 你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码。

2.1 传统路由

  • 要从 URL 中取值,使用尖括号。
  • 捕获的值可以选择性地包含转换器类型。比如,使用 <int:nid> 来捕获整型参数。如果不包含转换器,则会匹配除了 / 外的任何字符。
  • 这里不需要添加反斜杠,因为每个 URL 都有。比如,应该是 article 而不是 /article
  • 除了int,还有以下类型:
  • int,整数
  • str,字符串 /
  • slug,字母+数字+下滑线+-
  • uuid,uuid格式
  • path,路径,可以包含 /

2.2 无名分组和无名分组

2.2.1 无名分组
re_path(r"^del/(\d+)/") 
# 前端路由访问  http://127.0.0.1:8000/del/1/
# 后端
def del(request,id, *args, **kwargs):
    # 有一个位置参数会接收到 前端路由地址中的参数 1
    print(id)

    print(args)  # ('1',)
    print(kwargs)
    return HttpResponse("del_book")
2.2.2 有名分组
# 路由语法
re_path(r"^del/(?P<year>\d+)/") # 匹配到任意数据 ---> 用 year关键字接收到

# 前端路由访问 http://127.0.0.1:8000/del/1/

# 后端
def del(request,year, *args, **kwargs):
    # 上面的位置参数必须跟 url 里面的正则匹配的变量名一致
    # 如果你不跟路由一样,会报错,提示缺少一个必要的位置参数
    print(year)
    print(args)
    print(kwargs)  # {'year': '1'}
    return HttpResponse("del_book_one")
2.2.3 有名分组和无名分组混用
# 无名有名混合使用
re_path(r'^index/(\d+)/(?P<year>\d+)/', views.index),

# 前端访问 http://127.0.0.1:8000/del_two/1/2/

# 后端只会接收到有名分组而无法接收到无名分组
# 结论就是:不能混用

2.3 请求示例

from django.contrib import admin
from django.urls import path
from apps.web import views

urlpatterns = [
    path('news/<int:nid>/', views.news),
    path('article/', views.article),
]
  • Views.py
def news(request, nid):
    print(nid)
    return HttpResponse("新闻")

def article(request):
    nid = request.GET.get("nid")
    print(nid)
    return HttpResponse("文章")

3. 路由分发

由于Django项目会创建很多app,一旦多起来看这很嘈杂,然后我们就可以使用include进行路由拆分,创建多个app,统一放在apps文件夹下,每个app各自创建一个urls.py文件

3.1 include分发

include 用于包含其他 URL 配置。这样可以将一个大的 URL 配置拆分成多个小的配置文件,提高可读性和维护性。

  • api/web两个app
  • api app
# api/urls.py
from django.urls import path
from apps.api import views

urlpatterns = [
    # auth
    path('auth/', views.auth),
    # login
    path('login/', views.login)
]

# api/views.py
from django.shortcuts import render, HttpResponse

def auth(request):
    return HttpResponse("Hello, world. You're at the")

def login(request):
    return HttpResponse("Hello, world. You're")
  • web app
# web/urls.py
from django.urls import path
from apps.web import views

urlpatterns = [
    # news
    path('home/', views.home),
    # article
    path('article/', views.article)
]

# web/views.py
from django.shortcuts import render, HttpResponse

def home(request):
    return HttpResponse("主页")

def article(request):
    return HttpResponse("文章")

  • 根目录 urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('api/', include('apps.api.urls')),
    path('web/', include('apps.web.urls')),
]

  • 根据根目录的路径前缀,api/或者web/ 找到对应的app,从而找到相对应的路径

3.2 手动路由分发,可以与app无关

path('user/add/', views.login),
path('user/delete/', views.login),
path('user/edit/', views.login),
path('user/list/', views.login),


path('user/', ([
                   path('add/', views.login),
                   path('delete/', views.login),#/user/delete/
                   path('edit/', views.login),
                   path('list/', views.login),
               ], None, None)),

纯粹帮助提取功能的URL,防止重复编写。

3.3 路由分发的本质

  • url对应函数
path(api/auth/',views.api.auth)
  • url对应元祖
# include返回的是个元祖
path('api/auth',include([] None None))

4. 反向解析 name,reverse

4.1 反向解析的本质

  • 先给路由起一个别名,然后,通过一些方法去解析别名,可以得到这个别名对应的路由地址
  • 先给路由与视图函数起一个别名
  path('auth/', views.auth, name="V1"),

4.2. 后端反向解析

from django.urls import reverse

# urls.py
urlpatterns = [
    # auth
    path('auth/', views.auth, name='v2'),
    # login
    path('login/', views.login, name="V1")
]

# views.py
def login(request):
    url = reverse("v2")
    return redirect(url)

4.3 前端反向解析

<a href="{% url 'v2' %}">111</a>

4.4 无名分组的反向解析

  • 有名分组和无名分组的反向解析是一样的
  • 有名分组是用kwargs参数,无名用args
# 后端
reverse("路由映射的别名",args=(额外的参数,))

# 前端
<a href="{% url '路由映射的别名' 额外的参数 %}">跳转链接</a>

5.名称空间 namespace

  • 当多个应用出现相同的别名,反向解析不会自动识别应用前缀
  • 正常情况下的反向解析是不能识别前缀的

标签:知识点,views,必备,py,urls,path,login,路由
From: https://www.cnblogs.com/Formerly/p/18102493

相关文章

  • ALGO3 智能订单路由
    RIT案例简介–ALGO3版本1.01智能订单路由你在JPLoneganChase的算法交易台做暑期实习生,该公司是世界上最负盛名的金融机构。贵公司必须处理大额采购订单新的分散市场环境中的机构。满足监管要求至关重要以完成NBBO(全国最佳出价和报价)的订单。此外,考虑到分散的市场,通过最小化潜在......
  • 软考中级软件设计师【结构化开发】知识点+题目
      一、耦合   耦合是模块之间的相对独立性(相互连接的紧密程度)的度量。耦合取决于各个模块之间接口的复杂程度、调用模块的方式以及通过接口的信息类型等,有以下几个类型。   无直接耦合:指两个模块之间没有直接关系,它们分别属于不同模块的控制和调用,它们之间不......
  • MySQL学习必备SQL_DDL_DML_DQL
     MySQL创建数据库需要自行创建,数据库名称可以为【schoolDB】,字符集【utf8】,排序规则【utf8_general_ci】,1.学生表DDLCREATETABLE`student`( `id`INT(11)NOTNULLAUTO_INCREMENTCOMMENT'学号', `createDate`datetimeDEFAULTNULL, `userName`VARCHAR(......
  • MySQL学习必备查询语句like_between and_in
     MySQL创建数据库需要自行创建数据库名称可以为【schoolDB】,字符集【utf8】,排序规则【utf8_general_ci】,建表操作:CREATETABLE`student`( `id`INT(11)NOTNULLAUTO_INCREMENTCOMMENT'学号', `createDate`datetimeDEFAULTNULL, `userName`VARCHAR(20......
  • Go Template 常用疑难知识点
    前段时间,在项目开发中经常和go语言的HTMLLtemplate打交道,特意总结了几点我在使用中经常遇到不太明确的,比较纠结疑惑的知识点,巩固一下,也方便以后查找。​ 至于关于gotemplate的系统性的介绍说明,这是一篇我经常查看的文章,写的非常全面。1、作用域访问​ gotemplate中最常打交......
  • vue里面的路由参数和查询参数
    $router.push 在VueRouter中可以用来导航到不同的路由,并且你可以在其中添加参数。这些参数通常被称为“查询参数”或“路由参数”。 查询参数:这些是添加到URL末尾的参数,通常用于向服务器发送某些信息,但不会被包含在路由定义中。查询参数是通过 query 属性来传递的。例......
  • salesforce零基础学习(一百三十五)项目中的零碎知识点小总结(七)
    本篇参考:https://trailhead.salesforce.com/content/learn/modules/flow-implementation-2/debug-flows-as-another-userhttps://developer.salesforce.com/docs/platform/lwc/guide/create-components-dom-work.html?q=ref#refshttps://developer.salesforce.com/docs/platfo......
  • RT路由器 serial 口ppp multilink 绑定接口配置
    配置MutlilinkPPP捆绑,编号为1interfacemultilink1                   ipadd192.168.100.1255.255.255.0   pppmultilink                                ......
  • Vue学习笔记64--路由简介
    路由简介 路由就是一组key-value的对应关系多个路由,需经过路由器进行管理SPA应用:singlepagewebapplication(单页面web应用)Vue-router一:相关理解vue-router:vue的一个插件库(需安装--npminstallvue-router--save),专门用来实现SPA应用对SPA应用的理解singlepa......
  • vue3路由懒加载
            路由懒加载作用:部分项目过大,首次加载耗费时间较多,路由懒加载可以让首屏组件加载速度更快一些,减少用户首次使用等待时间    路由懒加载的本质:按需引入    下面是未使用懒加载的代码:importLoginfrom'@/views/login/index.vue'constrout......