路由层(urls.py)
Django的路由层是用于将URL映射到视图函数的机制。它用于确定请求URL(HTTP请求)应该被哪个视图函数处理。
Django的路由层包括两个部分:
- URL模式:匹配请求URL,决定应该使用哪个视图函数来处理请求。
- URL配置:将URL模式与应用程序中的视图函数关联起来,以便Django知道如何处理请求。
URL模式通常使用正则表达式来匹配请求URL。例如,下面是一个简单的URL模式:
from django.urls import path from . import views urlpatterns = [ path('articles/<int:year>/', views.year_archive), ]
总体来说,Django的路由层提供了一种灵活而强大的方式来处理请求URL,并将它们连接到相应的视图函数。
路由匹配
一,路由匹配按照正则匹配,一旦正则能够匹配到内容会立刻执行对应的视图函数。不会再继续匹配了
在setting.py中
urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'test',views.test), url(r'testadd',views.testadd) #第一个参数是一个正则表达式是访问后端静态资源的接口前缀 ]
用户在浏览器中输入url时不加最后的斜杠,django会让浏览器默认自动加上斜杠
可以在配置文件settings.py中指定是否开启该功能
APPEND_SLASH = True 表示开启 django会让浏览器默认自动加上斜杠APPEND_SLASH = False 表示不开启
无名分组
二,路由匹配url中的正则表达式分组:分组就是给一段正则表达式加括号
无名分组:
匹配的时候会将括号内正则表达式匹配到的内容当做位置参数传递给对应的视图函数
在urls.py文件中
url(r'^test/([0-9]{4})/',views.test)
在view.py 视图函数中
def index(request,args): return HttpResponse('')
有名分组
有名分组:
将括号内正则表达式起一个别名,匹配的时候,会将括号内的有别名的正则表达式匹配到的内容当做关键字参数传递给对应的视图函数
在urls.py 路由中
url(r'^test/(?P<year>\d+)/',views.test) # 起别名的方法:?P<别名>
在view.py 视图函数中
def index(request,year): ...
这里的视图函数中的第二个参数就是分组的名字
注意:无名有名能否混合不能使用。但是同一种命名方式 可以使用多个url(r'^test/(\d+)/(?P<year>\d+)/', views.test), #这是错的,有名无名不能混合使用。
url(r'^test/(\d+)/(\d+)/',views.test), #同一种命名方式 可以使用多个
url(r'^test/(?P<xxx>\d+)/(?P<year>\d+)/',views.test) # 同一种命名方式 可以使用多反向
反向解析
反向解析:通过一些方法能够得到一个结果,该结果可以访问到对应的url
反向解析的作用
<p> 要反向解析 才能拿到后端views中返回的html文件中的信息 <a class="btn btn-primary btn-lg" href="{% url 'detail' %}" role="button">点我</a> </p>
方法 :先给路由与视图函数对应关系起一个名字。(前端和后端可以根据这个名字,通过一些方法能够得到一个结果,该结果可以访 问到对应的url)
在urls.py路由中
url(r'^testadd/',views.testadd,name='add')
前端解析 表示:无论testadd改成什么,在前端页面html,都能拿到 **r'^...../'**中的东西
后端解析 表示:无论testadd改成什么,在后端视图view.py文件中,都能拿到**r'^...../'**中的东西
前端解析
在html文件中
{% url 'add' %} 比如:<a href=''{% url 'add' %}''>11</a>
后端解析
在views.py文件中
from django.shortcuts import reverse url=reverse('add') # _url是变量,reverse('add') 表示的是r'^...../'中的东西
无名分组反向解析
在urls.py路由中
url(r'^testadd/(\d+)/',views.testadd,name='add')
前端解析 表示:无论testadd改成什么,在前端页面html,都能拿到 **r'^...../'**中的东西
后端解析 表示:无论testadd改成什么,在后端视图view.py文件中,都能拿到 **r'^...../'**中的东西
前端解析
在html中
{% url 'add' 1 %} # 注意:这里的数字,一般都是用户的Id 既是:user_obj.id 既是:{% url '反向解析起的名字' user_obj.id %} 比如:<a href=''{%url 'add' 11%}''>11111</a>
后端解析
在views.py中
from django.shortcuts import reverse _ url=reverse('add',args=(1,)) # _url是变量,reverse('add') 表示的是 r'^...../' 中的东西,args=(1,) 接收的是数字,通常是数据的主键值,传给了(\d+)
有名分组反向解析
在urls.py中
url(r'^testadd/(?P<year>\d+)/',views.testadd,name='add')
前端解析 表示:无论testadd改成什么,在前端页面html,都能拿到 r'^...../' 中的东西
后端解析 表示:无论testadd改成什么,在后端视图view.py文件中,都能拿到 r'^...../' 中的东西
前端解析
在html中
{% url 'add' 1 %} {% url '反向解析的名字' user_obj.id %} 注意:(推荐用)这里的数字,一般都是用户的Id 既是:user_obj.id 比如: <a href=''{% url 'add' 11 %}''>11</a> 或者: {% url 'add' year= 1 %} # 标准的写法
后端解析
在views.py中
from django.shortcuts import reverse url=reverse('add',args=(1,)) # _url是变量,reverse('add') 表示的是r'^...../'中的东西。args=(12,) 接收的是数字(通常是数据的主键值),传给了(\d+) _url=reverse('add',args=(edit_id,))# 注意:(推荐用)这里的数字,一般都是用户的Id 或者: _url= reverse('add',kwargs={'year':12}) # 标准的写法
路由分发
当django项目比较庞大的时候 路由与视图函数对应关系较多,总路由代码太多冗长。考虑到总路由代码不好维护,所以django支持每个app(应用)都可以有自己的urls.py
总路urls 由不再 做路由与视图函数的对应关系 而仅仅 只做一个分发任务的操作:
根据请求的不同识别 出当前请求需要访问的功能属于哪个app, 然后自动下发到对应app 里面的urls.py 中 ,然后由app里面的urls.py做路由与视图函数的匹配
注意:
不仅如此每个app 除了可以有自己的urls.py之外 还可以有自己的static文件夹 ,templates模板文件
应用场景:
基于上面的特点,基于django分小组开发,会变得额外的简单。每个人只需要开发自己的app即可之后只需要创建一个空的django项目,再将多个人的app全部拷贝项目下,去配置文件注册,由总路由分发一次即可。
使用方法:需要导入一个分发的模块 :from django.conf.urls import include
总路由
在urls.py文件中 方法一、 from django.conf.urls import url,include from app01 import urls as app01_urls from app02 import urls as app02_urls urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^app01/',include(app01_urls)), url(r'^app02/',include(app02_urls)) ] 方法二、简写 from django.conf.urls import url,include urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^app01/',include('app01.urls')), url(r'^app02/',include('app02.urls')) ]
子路由
from django.conf.urls import url from app01 import views urlpatterns = [ url(r'^index/',views.index) ] from django.conf.urls import url from app02 import views urlpatterns = [ url(r'^index/',views.index) ]
虚拟环境
虚拟环境就类似于一个纯净的python解释器环境就类似于你重新下载一个python解释器
我们想做到针对不同的项目 只安装项目所需要的功能模块,项目用不到的一概不装,来避免加载资源时的消耗
如何创建虚拟环境
Django版本区别
- 路由文件
django1.x中使用的是url:支持正则
django2.x中使用的是path(不支持正则:精准匹配)和re_path(url):支持正则
path:但是它只支持五种转换器
Django默认支持以下5个转化器:
● str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
● int,匹配正整数,包含0。
● slug,匹配字母、数字以及横杠、下划线组成的字符串。
● uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
● path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)
自定义转化器
- 创建表关系
django2中必须指定参数:on_delete:
djanxo1中不用指定:级联更新级联删除
伪静态的概念(了解)
伪静态: 其实就是把动态页面改成像静态页面的样子
动态页面:
它不是在html页面中写死的,它是根据后端的数据变化而变化
我们的页面上的数据是从数据库查询出来都是可以是动态页面
静态页面 :
html
css
案例 :https://www.cnblogs.com/bigsai/p/17827160.html # 这个就是伪装之后的页面
伪装成静态页面的目的:
为了更好的被各大搜索引擎抓大,静态页面是最容易被抓到的,有个别的网站就会做伪装,seo
seo:优化关键词被容易搜索到
sem: 广告(RMB)
怎么样去伪装
url(r'^v1/v2/test.html/$', views.test)
名称空间(了解)
# 第二种方式 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
END