002 Django 路由

01 路由分发

urls 文件中的对应关系:
		def get_timer(request):
    path('timer/', get_timer),

http://127.0.0.1:8000/timer
1. url地址的访问有请求头和请求方式,请求体数据
2. django接收到http请求后,获取uri的路径名成去匹配urls文件中的路径, 匹配成功后,执行映射的函数。

3.函数的返回值是响应给客户端的数据,响应数据也要有响应头和响应体,使用HttpResponse函数把数据体内容作为参数,整合成完成的响应体。

image-20230318194738746

timer/  游览器默认会自动url添加一个/ 
urls.py内的 Path 也要添加一个上/

7.urls导入的引用

#1 视图函数拆分到 功能应用内
from app01 import views
urlpatterns = [
    path('admin/', admin.site.urls),
    path('timer/', views.get_timer),
    path('', views.index),
]
# 通过把视图函数拆分到具备的app应用中,然后在把app的函数导入到当前urls的文件里,完成app的解耦的功能

#2 render返回 自动找到模板文件
在主目录下setting 文件中的为templates 默认配置了模板的目录,web目录和操作系统的文件目录要一一对应。

#3 render函数
 render函数接收到的是html静态文件,使用HttpResponse函数拼接成响应数据发回客户端, 

#4 返回动态文件
在视图函数内 把要显示的给用户数据做成变量,
在render函数内以字典的形式和html文件内的变量做绑定关系{{}},render函数在执行过程中,获取变量value,替换html的变量,Httpresponse封装响应数据,客户端发起一次请求,服务端执行一次函数,获取的数据不同,用户看到的数据也不同,达到动态页面的效果。
 

02 路由映射

urls 路由映射
uri 一对一 视图函数
多个uri 对应 一个视图函数
但是绝对不能 一个uri 对应多个函数,且只能生效第一个。


视图函数为什么不能加括号,因为django会调用函数并且传参request,request是客户端的请求数据。

wsgi文件:  封装了socket,功能是
1 解析请求数据,并且把解析的数据以requet参数的形式 传给urls 

2.封装响应数据

03 分组请求

path请求的路径使用 正则匹配原则,扩展了请求业务的多样性,

匹配的数据需要传到view中的函数内,需要把数据以形参的形式传入,
参数的形式有位置参数和关键字参数,
在path中的表现形式分别是位置参数 关键字参数,函数根据参数获取数据,并返回。
无名分组
from  django.urls import path ,re_path # 默认只处理path,匹配 正则的字段要导入 re_path

re_path('action/(\d{4})',app01.views.index) 
# 使用正则匹配url( \d{4}) 是4个数字,匹配成功。
# 并且把url 匹配的值,以分组的形式,传参到 要执行的函数中,def index(request,year): 
# 函数才能获取到形参

def index(request, year, month):
    print(year,month)
    return HttpResponse('2023')

urlpatterns = [
    re_path("articles/(\d{4})/(\d{1,2})",index)
]
# 通过uri 的分组不同,把形参带入到函数中,达到可以查询不同的年份。
路由的正则匹配 <位置传参>

在path中如果没有正则的规则, 默认^$ 完全匹配

如果有正则,则按照正则的匹配规则出来,注意规则的闭合

访问 ttp://127.0.0.1:8000/indexs/XXX    indexs确实有这个规则 path 能够匹配到路径中,但是为什么访问不到?
        
  urlpatterns = [
    # path('index/', app02.views.index),
    path('indexs/', app02.views.index),  # path 默认自动了^$  ,必须完全匹配
      
访问 ttp://127.0.0.1:8000/action/2001/xxx 
    re_path('action/(\d{4})',app01.views.year), 
      # re_path 模块 \d{4} 只有匹配4个数字就回去执行函数,
      # 因为没有路径的闭合,所以不论后面的路径怎么样,还是会执行函数的
      # 如果说有细分年 月 日 的路径 那么一定要对路径闭合,不然只会走年的路径
      
re_path('^action/(\d{4})$',app01.views.year),   # 精准匹配年份
re_path('action/(\d{4})/(\d{2})',app01.views.mooth),  # 这样才能正常匹配月份。

有名分组 <关键字传参>
正则匹配的传参问题, 上面的传参

re_path('action/(\d{4})/(\d{2})',app01.views.month) 
               # 年的传参  月的传参  
def mooth(request,year,mooth):
               # 接收年的形参  接收月的形参  
    return  HttpResponse(year+ "年" + mooth +"月" + "的文章")

优化
re_path('action/(?p<year>\d{4})/(?p<month>\d{2})',app01.views.month) 
               # 年的传参  月的传参  
    
def mooth(request,month,year): # 这样就不用以位置参数的顺序写参数,而是以关键字的形式写参数
               # 接收年的形参  接收月的形参  
    return  HttpResponse(year+ "年" + mooth +"月" + "的文章")

04 路由分发

全局的view,model可以根据app拆分,那么全局的urls.py 路由也是可以拆分的

通过 setting.py 的app注册,完成 app的引入路径
通过 urls.py 的include 完成app的urls的引入
#
urlpatterns = [

    # 看注释 是基于类的视图
    # path('index/', app02.views.index),
    # path('indexs/', app02.views.index),  
    # path('index/',include('app01.urls')),
    # 基于另外一个urls 配置文件的导入,相当于 配置一个二级域名
 
    path('action/',include('app02.urls')),
		app02.urls内,只匹配当前app内的函数路径即可	



05 路由转发器 -- 自定义路由

前提是 正则匹配的规则 放到了re_path路由路径上去了,如果要修改某个规则,需要修改路径名称,需要分割出来
urlpatterns = [
    re_path('^(\d{4})$',app02.views.year),
    re_path('(\d{4})/(\d{2})',app02.views.mooth),
]
观察只有匹配到路径后,才会触发view的函数,写一个函数的返回值,匹配的规则在函数内,解耦开来
	
path(,)

posted @ 2022-05-17 17:16  mmszxc  阅读(176)  评论(0)    收藏  举报