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

相关文章

  • ajax的请求,异步,同源策略的学习

    Ajax Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指⼀种创建交互式⽹⻚应⽤的⽹⻚开发技术。 Ajax 是⼀种⽤于创建快速动态⽹⻚的技术。 Ajax 是⼀种在⽆需重新加载整个⽹⻚的情况下,能够更新部分⽹⻚的技术。 通过在后台与服务器进⾏少量数据交换,Ajax 可以使⽹⻚实现异步…

    2023年4月2日
    00
  • matplotlib画图基础知识

    matplotlib plt.plot()绘制线性图 绘制单条线形图 绘制多条线形图 设置坐标系的比例plt.figure(figsize=(a,b)) 设置图例legend() 设置轴的标识 图例保存 fig = plt.figure() plt.plot(x,y) figure.savefig() import matplotlib.pyplot as …

    2023年4月2日
    00
  • Django_request学习

    Django_request (1)请求方式 这里使用一个接口测试软件postman 可以看到里面有非常多的发起请求的方式,最常用的就是GET和POST请求,但是这些方法无法在网页的url里显示 在学习request参数之前,django框架中首先接到浏览器发来的请求第一站是经过框架自带的wsgi.py文件 “”” WSGI config for djang…

    2023年4月2日
    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
  • linux下c语言的crypt函数怎么用?

    linux的crypt 最近学校布置了一个网安的小作业,要用到linux里面的这个crypt函数,写一篇总结一下。首先我们要了解这个函数是用来做什么的。 密码影子文件中存储了每一个用户的用户明文和其单向哈希过的秘文 cipher = “$1$C68vnJ27$1ttFZ1/Rylq/xi350A0NI0”; 密码字段用\(id\)salt$hashed的格式…

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

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

    PHP 2023年4月17日
    00
  • mysql面试小结

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

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

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

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