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
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),
# 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('^testadd/(?P<year>\d+)/(?P<month>\d+)$', views.testadd, name='testadd') # name路由名字
# 后端解析
# 后端反向解析
print(reverse('test')) # /test/ /test/v1/ /test/v1/v2
# 前端解析
<a href="{% url 'test' %}">点我</a>
无名分组反向解析
前端解析
<a href="{% url 'test' 111 %}">点我</a>
后端解析
print(reverse('test', args=(123, ))) # /test/1 /test/123
# 问题:这个参数我到底指定几?
reverse('test', args=(123, ))
有名分组反向解析
前端解析
<a href="{% url 'testadd' 2023 12 %}">点我</a>
后端解析
print(reverse('testadd',kwargs={'year':2023, 'month':12})) # /testadd/2023 /testadd/2023/12
django2中的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不支持
path('order/<int:year>',views.order),
]
路由分发
# 目前一个django项目只有一个总路由文件urls.py
# 但是当我们的路由比较多的时候,这个文件就会产生很多的路由地址,产生的问题就是理由比较臃肿,不太容易管理,也不太容易排查错误
我们针对每一个应用也可以有自己的路由文件,每一个应用下的路由我们称之为是子理由
但是你会发现每一个应用下面没有urls.py这个文件
我们需要自己手动创建出来一个文件
'''这个时候产生了很多的路由文件,匹配的时候先匹配总路由,然后有总路由进行分发到每个子路由'''
# 这个时候总路由的作用就是分发了,总路由就不再执行具体的视图函数,而是交给子路由
# url('^app01/', include(app01_urls)),
# url('^app02/', include(app02_urls)),
# 第二种方式
url('^app01/$', include('app01.urls')),
url('^app02/$', include('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
# 难道我们每一个项目都使用一个解释器吗? 肯定不是
# 每个项目单独使用一个解释器版本,这个解释器中只安装这个项目使用到的模块
# 每开发一个项目我就下载一个解释器,当然能够解决问题,你想这样做吗?
我们会使用虚拟环境来解决这个问题
虚拟环境其实就是一个纯净版本的解释器,你不用每次都下载和安装
# 它就是一个文件夹形式存在的解释器
# 虚拟环境尽量不要创建,创建出来够你的项目使用就行了
# 虚拟环境还可以通过命令创建
标签:url,testadd,虚拟环境,分组,test,path,路由
From: https://www.cnblogs.com/huangchunfang/p/17593433.html