- # 路由匹配
- path('test', views.test),
- path('testadd', views.testadd),
无法跳转到
testadd
- # 路由匹配
- path('test/', views.test),
- path('testadd/', views.testadd),
在参数尾部加一个
/
url 的时候会默认加一个 /
/ 再尝试一次
- 在配置文件中,有一个参数可以帮助我们干这件事
APPEND_SLASH = True
- 这个参数默认为True,即自动帮我们加
/
re_path('^test/$', views.test),
这才是完整版的路由匹配格式
re_path('^$', views.test),
匹配首页的路由格式
- # django2中
- path('admin/', admin.site.urls), # 精准匹配,不支持正则表达式
- path('test/', views.test), # 精准匹配,不支持正则表达式
- re_path(r'^test/$', views.test) # url(r'^test/$', views.test),
- 无名分组
- url(r'^test/(\d+)$', views.test),
- get请求的第一种方式:
- http://127.0.0.1:8000/test/?a=1&b=2
- get请求的第二种方式:
- http://127.0.0.1:8000/test/123/11
- #有名分组
- url(r'^test/(?P
\d+)/(?P\d+)$' , views.test),
无名分组和有名分组不能混用
但是同一个分组可以使用多次
-
- # 无名有名混合使用
- url(r'^test/(?P
\d+)/(\d+)$' , views.test),
通过一些方法得到一个结果,该结果可以直接访问到对应的url,触发视图函数
先给路由与视图函数起一个别名
url(r'^v1/v2/v3/home$', views.home, name='home'),
反向解析
后端反向解析
- res=reverse('home') # /v1/v2/v3/home
- print(res)
"{% url 'home' %}">xxxx
本质上还是通过一些方法得到一个结果,该结果可以访问到对应的url从而触发相应的视图和功能
- #无名分组反向解析
- url(r'^v1/v2/v3/home/(\d+)/(\d+)/$', views.home, name='home')
- # 后端解析
- res=reverse('home', args=(123, 11)) # /v1/v2/v3/home/1
- print(res)
- # 前端解析
- #有名分组反向解析
- url(r'^v1/v2/v3/home/(?P
\d+)/(?P\d+)/$' , views.home, name='home')
- # 后端解析
- res=reverse('home', args=(123, 11)) # /v1/v2/v3/home/1
- res=reverse('home', kwargs={'year':123, 'mon':1}) # /v1/v2/v3/home/1
- print(res)
- # 前端解析
Django每一个应用都可以拥有属于自己的
正是基于上述的特点,Django可以很好的做到自己的分组开发(每个人只写自己的app)
最后只需要将所有的app拷贝到新的文件,并将这些APP注册到配置文件中,然后再利用路由分发的特点,将所有的APP整合起来
当一个项目中的URL特别多的时候,总路由urls.py的代码非常冗余而且不好维护,这个时候就可以利用路由分发来减轻总路由的压力
利用路由分发之后,总路由不再干预路由与视图函数的直接对应关系
- # 路由的分发
- url(r'^app01/', include(app01_urls)),
- url(r'^app02/', include(app02_urls)),
- # 第二种方式
- url(r'^app01/', include('app01.urls')),
- url(r'^app02/', include('app02.urls')),
分发的路由第一个参数最后一个不要加 $
- # 第二种方式
- url(r'^app01/', include('app01.urls', namespace='app01')),
- url(r'^app02/', include('app02.urls', namespace='app02')),
-
- # 解析
- res=reverse('app01:login', args=(11,22)) # /v1/v2/v3/home/1
- res=reverse('app02:login', args=(11,22)) # /v1/v2/v3/home/1
只要保证名字不冲突,就没必要使用名称空间
一般情况下,有多个app的时候只要在前面加上app的前缀,这样就能够确保多个app之间名字不冲突
动态页面:
它不是在html页面中写死的,它是根据后端的数据变化而变化
我们的页面上的数据是从数据库查询出来都是可以是动态页面
案例:
https://www.cnblogs.com/bigsai/p/17827160.html 这个就是伪装之后的页面
伪装的目的:
为了更好的被各大搜索引擎抓大,静态页面是最容易被抓到的,有个别的网站就会做伪装,seo
seo:优化关键词被容易搜索到
sem: 广告(RMB)
怎么样去伪装
url(r'^v1/v2/test.html/$', views.test)
虚拟环境:
每创建一个虚拟环境就类似于重新下载了一个纯净的python解释器
但是虚拟器不建议下载太多,创建虚拟环境是需要消耗磁盘空间的
模块管理文件:
每个项目都需要用到很多模块,并且每个模块的版本可能是不一样的
这种情况下我们会给每一个项目配备一个requirements.txt文件,里面存放着我们这个项目所安装的所有模块及版本
只需要一条命令即可安装所有模块及版本
Django默认支持以下5个转化器:
● str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
● int,匹配正整数,包含0。
● slug,匹配字母、数字以及横杠、下划线组成的字符串。
● uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
● path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)