今日内容回顾(django入门之路由系统)

django请求生命周期流程图

-- 浏览器 发送请求(默认基于HTTP协议),通过web服务网关接口,

-- web服务网关接口,就是wsgiref(基于WSGI协议开发的),django默认的服务 请求来的时候拆解数据交给django端。

-- 中间件,帮助我们对请求进行校验或在请求对象中添加相关数据

-- 路由层,进行路由分发,匹配相对应的视图函数

-- 视图层,执行核心业务逻辑代码

-- 模型层,调用modles.py中表对象,通过orm拿到数据库(DB)的数据

--模板层,同时拿到templates中相应的模板进行渲染

然后将这个封装了模板,响应传输到中间件中检验,依次进行处理,最后通过WSGi再进行封装处理。

响应给浏览器展示给用户。

路由匹配

如: http://127.0.0.1:8000/hellow/
path("网址后缀",视图函数)
urlpatterns = [
    path('hello/', view.hello)]
# 一旦网址后缀匹配上了,就会自动执行后面的函数
# 并结束整个路由的匹配
  • 路由结尾的斜杠

    默认情况下不写斜杠,django会做二次处理

    第一次匹配不上,会让默认在结尾加斜杠再次请求

    django配置文件中可以指定是否自动添加斜杠

    # setting.py配置文件中添加下列代码
    APPEND.SLASH = False	# False表示取消添加斜杠
    
  • path转换器

    当网址后缀不固定的时候,可以使用转换器来匹配

      'int': IntConverter(),
      'path': PathConverter(),
      'slug': SlugConverter(),
      'str': StringConverter(),
      'uuid': UUIDConverter(),
    path("func/<int:year>/<str:info>/",view.func)
    # 转换器匹配到的内容会当作视图函数关键字参数传入。
    	# 转换器有几个叫什么名字,那么视图函数的形参必须对应
        # 如下:
        def func(request,year,info):
            pass
    
  • re_path正则匹配

    在django1.11版本中,只支持正则匹配 并且方法是 url("^func",views.func)

    在django2版本以后,默认是path() 也可以使用re_path()等价于 url()

    基本使用:re_path(正则表达式,函数名)

    一旦网址后缀的正则能够匹配到内容就会自动执行后面的函数,并结束整个路由的匹配。

    re_path("^func/$",views.func)
    # 当网址不固定时,可以使用转换器来匹配
    
  • 正则匹配之无名分组

    正则表达式匹配到的内容会当作视图函数的位置参数传递给视图函数

    re_path("^func/(\d+)/",views.func)  # 表示 网址前缀func斜杠后面可以输入任意数字
    
  • 正则匹配之有名分组

    正则表达式匹配到的内容会当作视图函数的关键字参数传递给视图函数。

    re_path("^func/(?P<year>\d+)/(?P<others>.*?)/",views.func)
    

反向解析

反向解析作用,用于防止页面上提前写死了很多路由,

一旦路由发生变化导致所有页面相关链接失效,可以使用反向解析。

# 反向解析:返回一个结果,该结果可以访问到对应的路由
1. 路由对应关系起别名
	path("register/",views.reg,name = "reg_view")
2. 使用反向解析语法
	html页面格式
    {%	url	 "reg_view	"%}
    后端
    from django.shortcuts import reverse
    	reverse("reg_view")
 # 反向解析的操作三个方法都一样,path()、re_path()、url()

无名有名反向解析

# 正则匹配无名分组反向解析
	# 当有不确定的匹配因素,反向解析的时候需要人为的给出一个具体的值
	re_path("^func/(\d+)/",views.func,name = 'fff')
    前端
    {%	url "fff" 123 %}
    后端
    reverse("fff",args=(123,))
"""
这个数字一般情况下可以选择放置数据的主键值,可以更加方便的处理数据的增删改查
	如:
		re_path("^func/(d+)/",view.func,name="fff")	
		后端:
			def func(request,func_id)
				reverse("fff",args=(func_id,))			
		后端:
			{% for user_obj in user_queryset %}
			<a href="{% url 'xxx' user_obj.id %}">编辑</a>
			{%endfor%}
"""
# 有名分组反向解析
	re_path("^func/(?P<year>\d+)/",views.func,name="fff")
    
    <a href="{% url 'ooo' 123 %}">222</a>
    
    print(reverse('ooo',args=(111,)))

路由分发

django中的应用都可以有自己独立的urls.py temolates文件夹 static文件夹

能够让基于django开发的多个应用完全独立,便于小组开发。

"""
总路由内只写相当于引导信息,当需要路由匹配的时候
总路由引导其去子路由下进行路由匹配,总路由不在存放网址后缀与视图函数的对应关系了
由子路由进行存放,当项目特别大 应用特别多的时候,就可以考虑使用路由分发。
""" 
总路由:
    path('app01/', include('app01.urls')),
    path('app02/', include('app02.urls')),
子路由:
	path('after/', views.after)  # app01
    path('after/', views.after)  # app02

名称空间

有时候有的路由分发场景下多个应用在涉及到反向解析别名冲突的时候无法正常解析

解决方式1
	名称空间
    	namespace
        	path('app01/', include(('app01.urls', 'app01'), namespace='app01'))
           path('app01/', include(('app01.urls', 'app02'), namespace='app02'))
解决方式2
	别名不冲突即可
"""
保证django项目下没有重复的别名即可
"""

posted @   瓮小辉  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示