Django基础之路由(urls)层
无名分组与有名分组
无名分组
对于正则加括号,会将括号内匹配到的内容当做位置参数传递给后面的视图函数test(request,args)
eg:
url(r'^test/(d+)/',views.test)
有名分组
就是给正则起个别名
会将括号内匹配到的内容当做关键字参数传递给后面的视图函数test(request,month=123)
这个month也可以是其他值
eg:
url(r'^test/(?P<month>d+)/',views.test)
注意
有名分组和无名分组不能结合使用,但是无名和有名分组单独使用的情况下可以使用多次,就是一个里面有多个分组
eg:
url(r'^test/(d+)/(d+)/',views.test)
url(r'^test/(?P<month>d+)/(?P<month>d+)/',views.test)
反向解析
根据某一个东西,动态解析出一个结果,该结果可以直接访问对应的url
怎么去做呢?
答:给路由与视图函数对应关系起一个别名,后续根据这个别名就能够动态解析出对应的url
eg:
url(r^test_add/',testadd)
前段解析
{%url 'xxx' %}
后端解析
导入模块
import revers
url = revers('xxx')
无名分组反向解析
url(r'^test_addsajdsjkahdkjasjkdh/(d+)/', views.testadd,name='xxx')
前段解析
在模版login.html文件中,反向解析的使用
<a href="{% url 'xxx' 1 %}">222</a>
后端解析
在views.py中,反向解析的使用:
url = reverse('xx',args=(1,))
有名分组的反向解析
url(r'^test_addsajdsjkahdkjasjkdh/(?P<year>d+)/', views.testadd,name='xxx')
前段解析
<a href="{% url 'xxx' 1 %}">222</a>
<a href="{% url 'xxx' year=1 %}">222</a>
后端解析
url = reverse('xxx',args=(1,))
路由分发
eg:Django有100个app,那urls里面的代码过于冗长
Django里面的APP可以有自己的templates文件夹,static文件夹,和urls.py文件
总路由项目名下的urls.py不再做路由与视图函数对应关系了,而是做一个中转站,只负责将请求分发到不同的app中,在app中做视图函数的对应关系
具体操作:
from django.conf.urls import url,include
url(r'^app01/',include(app01_urls)),
url(r'^app02/',include(app02_urls))
名称空间
当我们的项目下创建了多个app,并且每个app下都针对匹配的路径起了别名,如果别名存在重复,那么在反向解析时则会出现覆盖,但是我们尽量不要重名
总路由
url(r'^app01/',include('app01.urls',namespace='app01'))
url(r'^app02/',include('app02.urls',namespace='app02'))
各个app的路由
print(reverse('app01:index'))
print(reverse('app02:index'))
伪静态
将动态网页假装成是静态的,这样做的目的是为了提高百度等搜索引擎的SEO查询优先级
搜索引擎在收录网站的时候,会优先手撸看上去像是静态文件的资源
无论你怎么使用伪静态进行优化,都干不过RMB玩家
哈哈哈!!!
虚拟环境
通常针对不停地项目,只会安装该项目所用到的,用不到的一概不装
不同的项目有专门的解释器环境与之对应
每创建一个虚拟环境,就类似于重新下载了一个python解释器
实际功能中针对不同而项目,有一个交叫requestments.txt
,该文件列出来的是一个个该项目需要用到的模块名和版本号
eg:
Django=1.11.11
nginx
后期会通过命令直接会去下载该文件内所有的模块及对应的版本
虚拟环境不要创建太多个,会占硬盘资源的操作
Django1版本和Django2 版本的区别
Django1.x
区别一:
urls.py
中1.x用的是url,2.x用的是path
2.x中的第一个参数不支持正则表达式,些写什么就匹配什么
2.x里面还有re_path,这个re_path就好比1.x中的url
区别二:
django2.x默认支持一下5种转换器(Path converters)
str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
int,匹配正整数,包含0。
slug,匹配字母、数字以及横杠、下划线组成的字符串。
uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)
例如
path('articles/<int:year>/<int:month>/<slug:other>/', views.article_detail)
# 针对路径http://127.0.0.1:8000/articles/2009/123/hello/,path会匹配出参数year=2009,month=123,other='hello'传递给函数article_detail