django学习_路由

django2

路由控制器

Route路由,是一种映射关系。路由是把客户端请求的url路径和用户请求的应用程序,这里意指django里面的视图进行绑定映射的一种关系。

请求路径和视图函数不是一一对应的关系

在django中所有的路由最终都被保存到一个叫urlpatterns的文件里,并且该文件必须在主应用下的urls.py里进行声明,这是由setting文件决定的

在django运行中,当客户端发送了一个http请求到服务端,服务端的web服务器则会从http协议中提取url地址, 从程序内部找到项目中添加到urlpatterns里面的所有路由信息的url进行遍历匹配。如果相等或者匹配成功,则调用当前url对象的视图方法。

(1)include基本使用

image-20220805115242956

其实在于项目名同名的app文件下的urls.py里有提供一段路由的使用,第三个使用的就是include函数

具体使用方法就是首先要导入这个模块和路由

from django.urls import include, path, re_path

urlpatterns = [
  path('ZJR/',include('ReginaApp.urls'))
]

ReginaApp.urls这个文件是不存在的,所以直接手动创建一个

from django.urls import path, include

from django.shortcuts import HttpResponse
from ReginaApp import views

urlpatterns = [
    path('regina/',views.get_ZJR)
]

这样做的目的就在于我们可以把路由分级,不需要把所有的路由函数都堆在同一个目录下面,当我们再访问127.0.0.1:8090时,此时是报错的,因为总路由里面没有根目录这个东西,如果想访问到get_ZJR这个视图函数,url需要加上ZJR/regina

image-20220805120903623

(2)re_path基本使用

re_path和path的作用是一样的。只不过're_path'是在写url的时候可以用正则表达式,功能更加强大

写正则表达式都推荐使用原生字符串。也就是以‘r’开头的字符串

在正则表达式中定义变量,需要使用圆括号括起来。这个参数是有名字的,那么需要使用'?P<参数的名字>'。然后在后面添加正则表达式的规则。

Eg:

(一)固定输出

在选择某个月的日历的时候,输入年月会相应的返回当时的文章


#djangoRegina.urls:
path('1999-12',views.article)

# reginaApp.views:
def article(request):
    return HttpResponse("1999-12 文章")

image-20220808164950698

那如果我要挑选的选项很多,path就会有非常多的路由要一一列举,所以这样做就很繁琐。

(二)加入正则

d表示数字,我们将原来的路由改为

re_path("article/d{4}/d{2}/",views.article)

image-20220808165727695

但是这样做,多月两位数月份就合理,一位数月份就会报错

image-20220808165932427

所以再把格式修改一下re_path("article/d{4}/d{1,2}/",views.article)

image-20220808222257141

(三)匹配参数

上图得知,我需要根据url里得到的年份去匹配文章,所以在路由中就要进行分组

re_path("article/(d{4})/(d{1,2})/",views.article)




def article(request,year,month):
    return HttpResponse("{}-{} 文章".format(year,month))

image-20220808223336078

image-20220808223356210

(四)覆盖
re_path("regina/(d{4})/",views.articleByYear),
re_path("regina/(d{4})/(d{1,2})/",views.articleByMonth)

在拥有相同的路由的时候,更短的路由具有更高的优先级

def articleByYear(request,year):
    return HttpResponse("{}文章".format(year))

def articleByMonth(request,year,month):
    return HttpResponse("{}-{}文章".format(year,month))

image-20220808223943480

如果想要区分开路由,则需要添加(符号`re_path("regina/(d{4})/)",views.articleByYear),`

image-20220808224032428

(五)有名分组

顾名思义想给我选定的分组起个名字,如果在不起名字的时候,视图函数的参数顺序是必须要固定的,乱序则会影响功能。所以给起个名字

re_path("regina/(?P<year>d{4})/(?P<month>d{1,2})/",views.articleByMonth)

def articleByMonth(request,month,year):
    return HttpResponse("{}-{}文章".format(year,month))

image-20220809095945764

(3)路由转发器

首先要在app下导入from django.urls import register_converter

#APP.urls
from django.urls import register_converter

class MobileConvert():
    regex = '1[3-9]d{9}'
    def to_python(self,value):
        print(type(value))
        # 将匹配结果传递到视图内部时使用
        # 返回str还是int主要看需求,纯数字的可以返回int
        return value
# register_converter(路由转换器的类名,调用别名)
register_converter(MobileConvert,"mobile")


urlpatterns = [
    path('regina/',views.get_ZJR),
    path("<mobile:number>",views.ZJrui) 这里的mobile要和注册时起的名字一致
#APP.views 这里的number要和路由中命名的名字一致
def ZJrui(request,number):
    return HttpResponse("HI,{}用户".format(number))

image-20220809104452720

(4)反向解析

这样做的好处就是可以把每一个正则规则放到子app下面

在使用Django 项目时,一个常见的需求是获得URL 的最终形式,以用于嵌入到生成的内容中(视图中和显示给用户的URL等)或者用于处理服务器端的导航(重定向等)。人们强烈希望不要硬编码这些URL(费力、不可扩展且容易产生错误)或者设计一种与URLconf 毫不相关的专门的URL 生成机制,因为这样容易导致一定程度上产生过期的URL。

在需要URL 的地方,对于不同层级,Django 提供不同的工具用于URL 反查:

  • 在模板中:使用url模板标签
  • 在Python 代码中:使用from django.urls import reverse 函数。

urls.py中为url设置别名参数:

from django.conf.urls import url
from . import views

urlpatterns = [
    #...
    url(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'),
    #...
]

应用之在模板中反向解析:

<a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a>
<a href="/articles/2012/">2012 Archive</a>

应用之在py文本中反向解析:

from django.shortcuts import redirect
from django.urls import reverse

def redirect_to_year(request):
    year = 2006
    reverse_path=reverse('news-year-archive', args=(year,))
    return redirect(reverse_path)  # 等效 redirect("/articles/2006/")

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:django学习_路由 - Python技术站

(0)
上一篇 2023年4月2日 下午5:14
下一篇 2023年4月2日 下午5:14

相关文章

  • django中间件以及自定义中间件

    middleware 中间件就是在目标和结果之间进行的额外处理过程,在Django中就是request和response之间进行的处理,相对来说实现起来比较简单,但是要注意它是对全局有效的,可以在全局范围内改变输入和输出结果,因此需要谨慎使用,否则不仅会造成难以定位的错误,而且可能会影响整体性能。 中间件有什么用 如果想要修改HttpRequest或者Htt…

    2023年4月2日
    00
  • pandas数据清洗

    数据清洗 数据清洗是对一些没有用的数据进行处理的过程。 很多数据集存在数据缺失、数据格式错误、错误数据或重复数据的情况,如果要对使数据分析更加准确,就需要对这些没有用的数据进行处理。 在这个教程中,我们将利用 Pandas包来进行数据清洗。 处理丢失数据 有两种丢失数据: None np.nan(NaN) 两种丢失数据的区别 为什么在数据分析中需要用到的是浮…

    2023年4月2日
    00
  • linux使用php-ast方法

    php-ast php-cs-fixer PHP-CS-Fixer 是一个开源工具,它可以强制执行和检测违反 PHP 编码风格的行为。 使用预定义的规则,它可以使您拥有严格的编码风格,该风格由工具强制执行,因此您可以将时间花在更重要的事情上。 安装过程 在github上其实给出了很多种安装方式,我直接下载了php-cs-fixer.phar文件并将其存储在计…

    PHP 2023年4月17日
    00
  • linux文件权限解读

    Linux 文件权限 文件权限和文件类型共有10个字符组成,这10个字符可以分成三部分 \[d+rwx+rwx+rw-\\d:表示文件类型\\2-4位(第一组rwx):表示文件所有者的对文件的权限\\5-7位(第二组rwx):表示文件所有者所在组的用户对文件的权限\\8-10位(rw-):表示其他用户对文件的权限 \] 其中 r 表示可读,w 表示可写,x …

    Linux 2023年4月18日
    00
  • django编写cookie

    cookie HTTP协议是一个无状态协议,即每一个请求都是独立的!无法记录前一次请求的状态,但HTTP会使用cookie值进行跟踪会话。在WEB开发当中,使用session来完成会话跟踪,session底层依赖于cookie技术。 其实cookies是由网络服务器存储在你电脑硬盘上的一个txt类型的小文件,它和你的网络浏览行为有关,所以存储在你电脑上的co…

    2023年4月2日
    00
  • 爬虫学习1——request使用

    爬虫 什么是爬虫: – 通过编写程序,模拟浏览器上网,然后让其去互联网上抓取数据的过程。 爬虫究竟是合法还是违法的? 在法律中是不被禁止 具有违法风险 善意爬虫 恶意爬虫 爬虫带来的风险可以体现在如下2方面:- 爬虫干扰了被访问网站的正常运营- 爬虫抓取了收到法律保护的特定类型的数据或信息 如何在使用编写爬虫的过程中避免进入局子的厄运呢? – 时常的优化自己…

    2023年3月31日
    00
  • mysql面试小结

    MySQL 1. 索引 1.1 什么是索引 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。 索引是一种数据结构。数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。 更通俗的说,索引就相当于目录。为了方便查找书中的内容,…

    MySQL 2023年4月18日
    00
  • Django_渲染详解

    Django_render 模板语法 模板引擎是一种可以让开发者把服务端数据填充到html网页中完成渲染效果的技术。它实现了把前端代码和服务端代码分离的作用,让项目中的业务逻辑代码和数据表现代码分离,让前端开发者和服务端开发者可以更好的完成协同开发。 静态网页:页面上的数据都是写死的,万年不变 动态网页:页面上的数据是从后端动态获取的(比如后端获取当前时间;…

    2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部