首页 > 编程语言 >Python基础day56 Django URL分组设置

Python基础day56 Django URL分组设置

时间:2023-07-31 18:56:17浏览次数:48  
标签:views Python Django URL 分组 url test path 路由

URL函数的使用(支持正则表达式)

# django1中使用的是url

url('test', views.test),
url函数的第一个参数是支持正则表达式的
如果匹配到一个路由,就不在往下匹配,直接执行路由对应的视图函数

# http://127.0.0.1:8000/test/
是django默认设置的,django会先拿着test去匹配,如果匹配不到,它会自动加一个斜杠再次去匹配

# 缓存:redis数据库缓存
APPEND_SLASH = False  # 默认不加斜杠匹配

# # django2中使用的是path
path('test/', admin.site.urls), # path是不支持正则的,它是精准匹配,输入的内容和路由地址必须是完全不配
re_path('^test/$', admin.site.urls) # django1中的url是完全一样的

无名分组

分组:在正则表达式中使用小括号括起来的内容就是分组

单独的分组其实是没有意义的,它不影响我们的正常匹配

re模块中的分组优先原则 re.match()  先把分组的内容显示出来

url('^test/(\d+)/(\d+)$', views.test),
def test(request, xx, yy):
    print(xx, yy) # 123 1
    return HttpResponse("test")

无名分组就是把路由地址匹配的数据以位置参数的形式传递给视图函数

 

有名分组

分组:在正则表达式中使用小括号括起来的内容然后给它起个名字就是有名分组
url('^testadd/(?P<year>\d+)/(?P<month>\d+)$', views.testadd)

# 有名分组就是把路由地址匹配的的数据以关键字参数的形式传递给视图函数

# 这种形式也是第二种传参方式
http://127.0.0.1:8000/testadd/123/11
http://127.0.0.1:8000/testadd/?a=1&b=2

        
# 有名分组和无名分组能否一起使用
不要一起使用

# 但是无名或者有名单独的可以使用多次
url('^testadd/(?P<year>\d+)/(?P<month>\d+)/(?P<month>\d+)/(?P<month>\d+)$', views.testadd)
url('^test/(\d+)/(\d+)/(\d+)/(\d+)/(\d+)/(\d+)/(\d+)$', views.test),

# 接收多个有名分组
def testadd(request, **kwargs):
    print(kwargs)
# {'year': '122', 'month': '444', 'day': '777'}

# 接收多个无名分组
def testadd(request, *args):
    print(args)
# ('122', '444', '777')

# django2中的用法
re_path('^test/(\d+)/(\d+)/(\d+)/(\d+)/(\d+)/(\d+)/(\d+)$', views.test),
re_path('^testadd/(?P<year>\d+)/(?P<month>\d+)/(?P<month>\d+)/(?P<month>\d+)$', views.testadd)

 

反向解析

反向解析:给路由器一个名字,然后通过一个方法可以解析出这个名字对应的路由地址

url(r'^test/v/d$', views.test, name='test'),  # name:路由取个名字
# 后端解析
print(reverse('test'))  #/test/  /test/v/d

# 前端解析
<a href="{% url 'test' %}">点我解析</a>
    return render(request, '反向解析.html')

 无名分组反向解析

# 前段解析
<a href="{% url 'test' 123 %}">点我解析</a>
前端里面指定的是多少,解析出来的就是多少

# 后端解析
print(reverse('test', args=(123,)))
# /test/123

# args后面的参数到底指定多少?
'''这个位置一般指定的是主键值'''

有名分组反向解析

# 前端解析
<a href="{% url 'testadd' 2023 12 %}">点我</a>
# 前端里面指定的是多少,解析出来的就是多少 

 

# 后端解析
print(reverse('test', kwargs={'year': 2023, 'month': 7}))
# /test/2023/7
# (?P<year>\d+)/(?P<month>\d+) 关键字传参的值无法确定,因此只能在后端kwargs中指定数值

Django中的path函数支持的5种转换器

path('test/', admin.site.urls)
Django默认支持以下5个转化器:

● str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
● int,匹配正整数,包含0。
● slug,匹配字母、数字以及横杠、下划线组成的字符串。
● uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
● path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)

urlpatterns = [  
    path('articles/2003/', views.special_case_2003),  
    path('articles/<int:year>/', views.year_archive),  
    path('articles/<int:year>/<int:month>/', views.month_archive),  
    path('articles/<int:year>/<int:month>/<slug>/', views.article_detail),  
  # path才支持,re_path不支持,re_path支持正则,正常使用正则即可
  path('order/<int:year>',views.order),
]

# 自定义转换器
'''
regex 类属性,字符串类型
to_python(self, value) 方法,value是由类属性 regex 所匹配到的字符串,返回具体的Python变量值,以供Django传递到对应的视图函数中。
to_url(self, value) 方法,和 to_python 相反,value是一个具体的Python变量值,返回其字符串,通常用于url反向引用。
'''

路由分发

目前一个Django项目下只有一个总路由文件:urls.py,但是当我们的路由比较多的时候,这个文件就会产生很多的路由地址,产生的问题就是路由太过臃肿,不太容易管理,也不太容易排查错误

因此,我们针对每一个应用也可以有自己的路由文件,每一个应用下的路由我们称之为是子路由,但是需要手动创建出来一个新的urls.py文件

这个时候产生了很多的路由文件,匹配的时候先匹配总路由,然后由总路由进行分发到每个子路由。

这个时候总路由的作用就是分发了,总路由就不再执行具体的视图函数,而是交给子路由

# 总路由配置
    url('^app01/', include(app01_urls)),
    url('^app02/', include(app02_urls))
# 第二种配置总路由方式
    url('^app01/', include('app01.app01_urls')),
    url('^app02/', include('app02.app02_urls')),

# 子路由正常导入即可

伪静态的概念

# 静态文件 .html
index.html

http://127.0.0.1:8000/app01/index
https://www.cnblogs.com/fanshaoO/p/17592993.html # 其实就是伪静态之后的地址
原本这个地址是动态的,数据是从数据库中查询出来的,而不是在html页面中写死的

# 为什么要伪静态呢?
"""
    作用就是让搜索引擎增大seo的查询力度,言外之意就是让我们的页面能够更加容易的被搜索引擎搜索出来
"""
# 比如你在百度中搜索一个关键词,百度的搜索引擎就会去全网搜索数据
# 其实搜索引擎(百度、谷歌、bing、等)就是一个巨大的爬虫程序

# 因为静态的页面更加容易被搜索引擎抓到,这个称之为是seo
# seo就是优化你们的产品能够被更容易的搜多到

SEO---------------------->一般是通过技术手段等实现
SEM---------------------->它是需要收费的,其实就是广告

虚拟环境

# 一般我们开发项目是一个单独的项目使用一个单独的解释器环境
举例:
开发一个CRM系统:3.6
开发一个OA系统:3.7
开发一个商城系统:3.6

# 难道我们每一个项目都使用一个解释器吗? 肯定不是
# 每个项目单独使用一个解释器版本,这个解释器中只安装这个项目使用到的模块

# 每开发一个项目我就下载一个解释器,当然能够解决问题,你想这样做吗?
我们会使用虚拟环境来解决这个问题
虚拟环境其实就是一个纯净版本的解释器,你不用每次都下载和安装
# 它就是一个文件夹形式存在的解释器

# 虚拟环境尽量不要创建,创建出来够你的项目使用就行了

# 虚拟环境还可以通过命令创建

 

标签:views,Python,Django,URL,分组,url,test,path,路由
From: https://www.cnblogs.com/zfq132/p/17594216.html

相关文章

  • URL函数的使用(支持正则表达式)、分组、反向解析、Django2的转换器、路由分发、伪静态的
    url('test',views.test),url函数的第一个参数是支持正则表达式的如果匹配到一个路由,就不在往下匹配,直接执行路由对应的视图函数 http://127.0.0.1:8000/test/是django默认设置的,django会先拿着test去匹配,如果匹配不到,它会自动加一个斜杠再次去匹配 去浏览器器搜索textadd只......
  • python openqyxl 操作excel
    importosimportsysfromopenpyxlimportload_workbookclassExcel:#读取数据def__init__(self,excel_path,sheet_name):""":paramexcel_path:excel文件路径:xx/xxx.xlsx:paramsheet_name:需要打开表格名字:sheet1......
  • 在python文件操作中使用writelines()函数却报write()函数使用错误
    代码是这样的:1deffunc1():2file=open("test.txt","a+",encoding="utf-8")3list1=[("20","10")]4list2=[{"name":"Tom","age":20}]5file.writelines(li......
  • 安装python以及常用库
    1. 去官网下载python,并安装,笔者版本3.11.4。【安装完毕后建议重启编译器和控制台,以确保导入了最新的环境变量】2. 设置镜像,加快pip3的下载速度。pip3configsetglobal.index-urlhttps://pypi.tuna.tsinghua.edu.cn/simple3. 安装numpy等  pip3installnum......
  • Jenkins 修改 webhook 链接 URL
    说明2023-03-1221:11:03 分享了一篇  https://blog.51cto.com/wst021sh/6116280 ,也就是介绍 Pipeline对比的文章。这里在简单阐述一下,Pipeline就是一套运行在Jenkins上的工作流框架,将原来独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排......
  • MegEngine Python 层模块串讲(下)
    在前面的文章中,我们简单介绍了在 MegEngineimperative 中的各模块以及它们的作用。对于新用户而言可能不太了解各个模块的使用方法,对于模块的结构和原理也是一头雾水。Python 作为现在深度学习领域的主流编程语言,其相关的模块自然也是深度学习框架的重中之重。模块串讲将对 ......
  • 【Python&目标识别】Labelimg标记深度学习(yolo)样本
    ​    人工智能、ai、深度学习已经火了很长一段时间了,但是还有很多小伙伴没有接触到这个行业,但大家应该多多少少听过,网上有些兼职就是拿电脑拉拉框、数据标注啥的,其实这就是在标记样本,供计算机去学习。所以今天跟大家分享下如何使用Labelimg去自己标记深度学习样本。......
  • 【Python】一键提取inp文件结构的脚本
    inp=input("输入文件路径:")#print(type(inp))ex_txt=inp+'-Struct.inp'inp=inp+'.inp'importref2=open(ex_txt,'w')withopen(inp,'r',encoding="utf-8")asf1:row_num=0foriinf1:......
  • django orm 使用关联字段查询和更新
    关联字段查询_exam_fields=['add_datetime','times','start_date','end_date','uuid','name','img','duration','bx_duration']_alias_......
  • Python 导入function和导入moudle的区别
    以pprint为例导入moudleimportpprint同比C#创建对象,可以通过moudle名访问其中定义的变量、函数、类是长期过程会将moudle定义加载到内存中,整个程序执行过程中均可使用访问方法moudleName.functionNamepprint.pprint(data)导入functionfrompprintimportpprint......