url函数的使用(支持正则表达式)
Django1中使用的是url:
url('test',views.test)
url函数第一个参数是支持正则表达式的,如果匹配到一个路由就不再往下匹配,直接执行相对应的函数。
正是因为支持正则,在匹配到testadd也会展示text的页面,因为在检测到test的时候就直接进入test对应的页面了
当在后面加一个“/”时,在浏览器中输入test时,Django内部做重定向,一次匹配不行,url会自动加“/”,来再次进行匹配。
http://127.0.0.1:8000/test/
是django默认设置的,django会先拿着test去匹配,如果匹配不到,它会自动加一个斜杠再次去匹配
如何取消斜杠:
在settings文件中,有:APPEND_SLASH =True,默认是True,也就是加/,True改为False即可取消/
以下方式是严格限制路由匹配,但是$有时候加,有时候不加:
django2中使用的是path
path('test/', admin.site.urls)
path是不支持正则的,是精准匹配,输入的内容和路由地址是完全匹配。
re_path('^test/$', admin.site.urls)
此时的re_path是支持正则表达式的。
无名分组和有名分组
分组:给某一段正则表达式用小括号括起来
无名分组:
就是将括号内正则表达式匹配的内容当作位置参数传递给后面的视图函数。
比如:
报错的原因:视图函数中少了一个参数来接受后面的数字
# 这是路由 url('^test/(\d+)', views.test) # 这是视图 def test(request, xx): print(xx) # 123 return HttpResponse("test")
url('^test/(\d+)/(\d+)$', views.test), def test(request, xx, yy): print(xx, yy) # 123 return HttpResponse("test")
有名分组:可以给正则表达式起一个别名
就是将括号内正则表达式匹配的内容当作关键字参数传递给后面的视图函数。
例如:
url(r'^test/(?P<year>\d+)$', views.test), # 这是路由 def test(request, year): #这是视图函数 print(year) # 2023 return HttpResponse("test")
结果:
有名函数和无名函数是否可以一起使用
不要一起使用
但是有名无名单独可以使用多次
无名函数使用多次,位置参数,args:
上面是视图,下面是路由
url(r'^test/(\d+)/(\d+)/(\d+)/(\d+)/', views.test), def test(request,*args,**kwargs): print(args) return HttpResponse("test")
有名函数多次使用,关键字参数,kwargs:
url(r'^test/(?P<year>\d+)/(?P<month>\d+)/(?P<day>\d+)/$', views.test), def test(request,*args,**kwargs): print(kwargs) return HttpResponse("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(r'^func_hhh/',views.func,name='123')
def func(request): return render(request,'func.html')
反向解析的两中方式:
后端反向解析:在views文件中导入reverse
print(reverse('123'))
前端反向解析
<a href="{% url '123' %}">123</a>
无名分组反向解析
写代码时应该在这里放的数字一般是数据的主键值
路由和视图写别名
前端解析
<a href="{% url 'test' 111 %}">点我</a>
后端解析:
print(reverse('test', args=(123, )))
有名分组的反向解析
前端解析:
中规中矩的写法:
<a href="{% url 'testadd' year=2023%}">点我</a> print(reverse('testadd',kwargs={'year':2023, 'month':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的每一个应用都可以有自己的template文件夹urls.py
但是当路由多的时候,这个文件就会产生很多的路由地址,产生的问题就是理由比较臃肿,不太容易管理,也不容易排查错误。
我们针对每一个应用也可以有自己的路由文件,每一个应用下的路由我们称之为子路由。
因为每一个应用下没有urls.py这个文件,我们需要自己手动创建一个文件出来。
这个时候产生很多路由文件,匹配的时候先匹配总路由,然后由总路由分发到每个子路由这个时候总路由的作用就是分发了,总路就不再执行具体的视图函数,而是交给子路由。
创建一个新的应用:
注意:总路由的url千万不能加$符号
总路由方法一:
总路由:
记住要导入模块,并且要重新命名
注意:总路由的url千万不能加$符号
总路由方法一:
总路由:记住要导入模块,并且要重新命名
总路由方法2:
方法2:用 .方法
子路由:
名称空间(别名冲突问题)
当多个应用出现了相同的别名,我们研究反向解析会不会自动识别应用前缀
正常情况下的反向解析是没有办法识别前缀的
总路由:
urlpatterns = [ url(r'^app01/',include('app01.urls',namespace='app01')), url(r'^app02/',include('app02.urls',namespace='app02')), ]
子路由:
解析时:
print(reverse('app01:ref')) print(reverse('app02:ref'))
{% url 'app01:ref' %} {% url 'app02:ref' %}
伪静态概念
静态文件 .html
http://127.0.0.1:8000/app01/index
https://www.cnblogs.com/fanshaoO/p/17592993.html # 其实就是伪静态之后的地址
伪静态的原因就是为了让搜索引擎增大seo的查询力度,言外之意就是让我们的页面能够更容易被搜索引擎搜索出来。
搜索引擎就是一个巨大的爬虫。
静态页面更加容易被搜索引擎抓到,称之为seo
seo就是优化产品使其更容易被找到
SEO---------------------->一般是通过技术手段等实现
SEM---------------------->它是需要收费的,其实就是广告
虚拟环境
一般我们开发项目是一个单独的项目,使用一个单独的解释器环境
举例:
开发一个CRM系统:3.6
开发一个OA系统:3.7
开发一个商城系统:3.6
不是每个项目都使用一个解释器,每个项目单独使用一个解释器版本,这个解释器只安装这个项目使用到的模块
每开发一个项目就下载一个解释器,可以解决问题,但是没必要,可以通过蓄奴环境来解决这个问题,虚拟环境其实就是一个纯净版本的解释器,你不用每次都下载和安装
# 它就是一个文件夹形式存在的解释器
# 虚拟环境尽量不要创建,创建出来够你的项目使用就行了
# 虚拟环境还可以通过命令创建
标签:匹配,views,url,test,path,路由 From: https://www.cnblogs.com/Lucky-Hua/p/17596703.html