Python Django路由详解

1.路由Router

在实际开发过程中,一个Django 项目会包含很多的 app,这时候如果我们只在主路由里进行配置就会显得杂乱无章,所以通常会在每个app 里,创建各自的 urls.py 路由模块,然后从根路由出发,将 app 所属的 url 请求,全部转发到相应的 urls.py 模块中。而这个从主路由转发到各个应用路由的过程叫做路由的分发。

路由匹配

# 使用ur1给视图函数传参数
path('index/',index)
path('detail/<int:id>/", detail)
# 给ur1取别名,那么在使用此ur1的地方可以使用别名。比如:
path('index/',index, name='index')
path('detail/<int:id>/", detail, name='detail')

命名空间

在实际应用中,Django中可能存在多个应用程序,每个应用程序都可能有自己的路由模块。为了防止路由冲突,Django提供了命名空间(namespace)的概念。命名空间是一种将路由命名为层次结构的方式,使得在查询路由时可以限定在该命名空间内 

一定要传入元组 

# 在根路由中可以设置命名空间
path('app/",include((App,urls',"App"),namespace='App'))

 路由跳转

在模版html文档中可通过2种方式实现路由跳转

  • url路由匹配方式是一层一层匹配对应的路由
  • 反向解析方式是先找到html文档,然后通过名称找到对应的路由。因此,这就有一个问题了,不同APP路由同名怎么办?这就是命名空间的作用了。

需要注意的是,写了命名空间,在视图函数和html文档中都要使用命名空间,没有使用命名空间则都不能使用

路由传参:加入参数类型与名称

在html文档中写入,注意user需要在渲染函数中传入

多个参数,要和参数名一致,类似于关键字传参

 反向解析与重定向

Django路由反向解析是一个非常重要的功能,它可以让我们在代码中使用路由别名替代URL路径,在修改URL时避免代码中的硬编码依赖,同时也可以提高可读性和可维护性。 

#在视图函数中,反向解析ur1:
from django.shortcuts import render, redirect, reverse
def buy(request):
return redirect(reverse("index'))
return redirect(reverse('deta11",args=[2]))
return redirect(reverse("deta11",kwargs=("1d": 2)))
# 在templates中,使用别名:
(% url 'detail' stu,id %)

重定向 

2.Django模版

在Django框架中,模板是可以帮助开发者快速生成量现给用户页面的工具
模板的设计方式实现了我们MVT中VT的解(M: Model,V:View,T:Template),VT有着N:M的关系,一个V可以调用任意T,一个T可以供任意V使用 MVC

模板处理分为两个过程

        加载HTML

        渲染数据
模板主要有两个部分
·        HTML静态代码
        模板语言,动态插入的代码段(挖坑,填坑)
模板中的动态代码段除了做基本的静态填充,还可以实现一些基本的运算,转换和逻辑
        静态页面:页面数据是本地固定的
        动态页面:页面数据来源于后台服务器
模板中的变量:视图传递给模板的数据,遵守标识符规则
        语法: (( var ]}
        如果变量不存在,则插入空字符串 

方法不能有参数
        {{str }}
        {{ str.upper }}
        {{ str,isdigit}}
        {{ dict.key}}
列表,使用索引,不允许负索引
        items= ['apples" 'bananas", 'carrots']
        {( items.2 })

模板中的标签
语法{% tag %)
作用
        1.加载外部传入的变量
        2.在输出中创建文本
        3,控制循环或逻辑

变量

在模版中,列表需要以.1的形式书写(字典以.key的形式书写)

标签

标签都要使用{%  %}表示 

if 语句:
        格式
        if单分支
                {% if 表达式 %}
                        语句
                {% endif %}
if双分支
                {%if 表达式 %)
                        语句
                {% else %}
                        语句
                {% endif %}
if多分支
                {% f 表达式 %}
                        语句
                {% elif 表达式 %}
                        语句
                {% else %}
                        语句

                 {% endif %}

注意变量和符号一定要加空格 

判断true或false
        {% if today_is_weekend %}
        <p>Welcome to the weekend!</p>
          {% endif %}
使用 and or not
        {%if athlete_list and coach_list %}
        <p>Both athletes and coaches are available.</p)
       {% endif %}
        {% if not athlete_list %}
        <p>There are no athletes.</p>
        {% endif %}
        {% if athlete list or coach list %}
        <p>There are some athletes or some coaches.</p>
         {% endif %}

 使用 in和noqin,
        {% if"bc" in "abcdef" %}
        This appears since "bc" is a substring of "abcdef"
         {% endif %}
        {% if user not in users %}
        If users is a list, this will appear if user isn't an element of the list. 

        {% endif %}

for 语句:
        {% for 变量 in 列表%}
        语1
        {% empty %}
        语2
        {% endfor %}
当列表为空或不存在时,执行empty之后的语句

forloop有很多属性,可以对下标进行操作 

循环嵌套

过滤器

格式为|操作:(操作数)的形式

过滤器可以传递参数,参数需要使用引号引起来比如join:{{ studentsljoin:'=' })
默认值:default,格式 {{varldefault:value}}
如果变量没有被提供或者为False,空,会使用默认值
根据指定格式转换日期为字符串,处理时间的就是针对date进行的转换
{[ dateVal l date:'y-m-d' }}

HTML转义
        将接收到的数据当成普通字符串处理还是当成HTML代码来渲染的一个问题
        渲染成html:
        {{codelsafe }}
打开自动转义转义、关闭自动转义
        {% autoescape off%}
                code
        {% endautoescape %}

模板继承


        block:
        {% block xxx%}
                code
        {% endblock %}
extends 继承,写在开头位置
        {% extends “父模板路径”}
include:加载模板进行渲染
        {% include ‘模板文件’%}
{{ block.super }}: 获取父模板中blocke的内容

父模版内容 

继承父模版 

默认情况下,子模板会覆盖义模板的内容 #
# 如果想将文模板中bLock的内容继承,则需要使用block.super #}

在Django项目中使用Jinja2模板引擎


Jinja2是Flask框架讲过的一个模板引擎,是模仿Django默认模板引擎基础上开发的,比Django模板引擎性能更好,功能更全。jinja2宣称比django默认模板引擎快10-20倍。Django也支持jinja2

1.安装jinja2模块
pip install jinja2

⒉.在settings.py所在目录中创建jinja2_env.py文件,并写入以下内容

from django.templatetags.static irport static
from django.urls irport reverse
from jinjo2 impcrt Envircnment
def environment(**cptions):
    env = Ervircnment(**options)env .globals.update({' static' : static,"url' : revcrsc,})
    return env

修改setting中的template

 

pycharm设置为jinja2

 

注意:使用jinjia2模板语法大多数与django相同,但是有一些区别:例如:

1.jinjia2中不能使用forloop,能够使用loop.

 

2.jinjia能支持有参数的函数调用,而django不支持。

 

  • 26
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Django中,路由(routing)是指将URL(统一资源定位符)映射到相应的视图函数或类的过程。Django使用URLconf(URL配置)来配置路由。 URLconf是一个Python模块,它定义了URL模式和对应的处理函数或类。Django通过匹配URL模式来确定应该调用哪个处理函数或类来处理请求。下面是一些关于Django路由的详细解释: 1. 根URLconf:每个Django项目都有一个根URLconf,它负责处理项目的根URL。这个根URLconf通常是项目目录中的urls.py文件,它定义了项目的顶级URL模式。 2. URL模式:URL模式是一个正则表达式(或字符串),用于匹配请求的URL。它可以包含变量和其他特殊字符来提取URL中的参数。URL模式在根URLconf和应用程序的URLconf中定义。 3. 处理函数或类:当URL模式与请求的URL匹配时,将调用相应的处理函数或类来处理请求。处理函数可以是常规的Python函数,也可以是基于类的视图。处理函数或类负责处理请求并返回响应。 4. 命名URL:Django允许为每个URL模式分配一个唯一的名称。这样可以使得在代码中引用URL更加方便和可维护。命名URL可以通过名称反向解析为对应的URL。 5. 包含(include):Django路由系统支持将URL模式划分为不同的模块。可以使用include函数将其他URLconf包含到主URLconf中,实现路由的分发和管理。 6. 参数传递:URL模式可以包含变量,这些变量可以从URL中提取出来,并作为参数传递给处理函数或类。这样可以实现动态的URL匹配和处理。 7. URL分发和重定向:Django允许将请求分发到不同的处理函数或类,并支持URL重定向。这样可以实现将请求从一个URL转发到另一个URL。 总的来说,Django路由系统提供了灵活和强大的功能,可以帮助开发者管理项目中的URL,并将请求分发到适当的处理函数或类。通过定义URL模式和处理函数或类,可以实现对不同URL的定制化处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

樱花的浪漫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值