Django的生命流程周期与路由层

Django的生命流程周期

 

 

 

 

路由层

  路由匹配

    url方法第一个参数是正则表达式

    只要第一个参数正则表达式能够匹配到内容,那么就会立刻停止往下匹配,直接执行对应的视图函数

url(r'test',views.test),
url(r'testadd',views.testadd)

    修改配置文件可以取消在匹配时自动加斜杠

APPEND_SLASH = False/True    # 默认是自动加斜杠的

 

    路由匹配的版本区别

复制代码
"""
1.django1.X路由层使用的是url方法
    而在django2.Xhe3.X版本中路由层使用的是path方法
    url()第一个参数支持正则
    path()第一个参数是不支持正则的 写什么就匹配什么
    
    
    如果你习惯使用path那么也给你提供了另外一个方法
        from django.urls import path, re_path
        re_path(r'^index/',index),
        
        from django.conf.urls import url        
        url(r'^login/',login),
  2.X和3.X里面的re_path就等价于1.X里面的url
 
 
2.虽然path不支持正则 但是它的内部支持五种转换器
    path('index/<int:id>/',index)
    # 将第二个路由里面的内容先转成整型然后以关键字的形式传递给后面的视图函数

    def index(request,id):
    print(id,type(id))
    return HttpResponse('index')
    
  
  
    str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
    int,匹配正整数,包含0。
    slug,匹配字母、数字以及横杠、下划线组成的字符串。
    uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
    path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)
    
3.除了有默认的五个转换器之外 还支持自定义转换器(了解)
class MonthConverter:
    regex='\d{2}' # 属性名必须为regex

    def to_python(self, value):
        return int(value)

    def to_url(self, value):
        return value # 匹配的regex是两个数字,返回的结果也必须是两个数字
    
    
    from django.urls import path,register_converter
    from app01.path_converts import MonthConverter

    # 先注册转换器
    register_converter(MonthConverter,'mon')

    from app01 import views


    urlpatterns = [
    path('articles/<int:year>/<mon:month>/<slug:other>/',     views.article_detail, name='aaa'),

]

"""
复制代码

 

  无名分组和有名分组

    分组指正则表达式中用括号扩起来的部分。

    无名分组就是将括号内正则表达式匹配到的内容当作位置参数传递给后面的视图函数

url(r'^test/(\d+)/',views.test)

def test(request,xx):
    print(xx)
    return HttpResponse('test')

 

     有名分组就是将括号内正则表达式匹配到的内容当作关键字参数传递给后面的视图函数

"""
可以给正则表达式起一个别名
"""
url(r'^testadd/(?P<year>\d+)',views.testadd)

def testadd(request,year):
    print(year)
    return HttpResponse('testadd')

 

    有名分组和无名分组不能混用,但可以单个使用多次

url(r'^index/(\d+)/(\d+)/(\d+)/',views.index),
url(r'^index/(?P<year>\d+)/(?P<age>\d+)/(?P<month>\d+)/',views.index),

 

  反向解析

    反向解析其实就是通过一个路由别名可以得到别名所在的这行路由的完整url,可以访问该url从而触发视图函数的运行

复制代码
# 最简单的情况 url第一个参数里面没有正则符号
    url(r'^index/',view.index,name='xxx')
# 前端
    {% url 'xxx' %}
# 后端
    from django.shortcuts import reverse
  reverse('xxx')
"""
别名不能出现冲突!!!
"""
复制代码

    无名分组反向解析

复制代码
# 无名分组反向解析
    url(r'^index/(\d+)/',views.index,name='xxx')

# 前端
    {% url 'xxx' 123 %}
# 后端
    reverse('xxx', args=(1,))

"""
    数字一般情况下放的是数据的主键值  可用于数据的编辑和删除
    url(r'^edit/(\d+)/',views.edit,name='xxx')
    
    def edit(request,edit_id):
        reverse('xxx',args=(edit_id,))
        
    {%for user_obj in user_queryset%}
        <a href="{% url 'xxx' user_obj.id %}">编辑</a>
    {%endfor%}
"""
复制代码

 

    有名分组反向解析

# 有名分组反向解析
   url(r'^func/(?P<year>\d+)/',views.func,name='ooo')
# 前端
    <a href="{% url 'ooo' year=123 %}">111</a><a href="{% url 'ooo' 123 %}">222</a># 后端    
   # 有名分组反向解析 写法1  了解
   print(reverse('ooo',kwargs={'year':123}))
   # 简便的写法 记跟无名一样的操作即可
   print(reverse('ooo',args=(111,)))

 

  路由分发

    django的每一个应用都可以有自己的templates文件夹,urls.py,static文件夹。

    当一个django项目中的url特别多的时候,总路由urls.py代码非常冗余不好维护。

    这个时候也可以利用路由分发来减轻总路由的压力。

    利用路由分发之后,总路由不再干路由与视图函数的直接对应关系而是做一个分发处理。

    识别当前url是属于哪个应用下的,直接分发给对应的应用去处理。

复制代码
# 总路由
from app01 import urls as app01_urls
from app02 import urls as app02_urls
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    # 1.路由分发
    url(r'^app01/',include(app01_urls)),  # 只要url前缀是app01开头 全部交给app01处理
    url(r'^app02/',include(app02_urls))   # 只要url前缀是app02开头 全部交给app02处理
  
    # 2.推荐使用,无需导入
    url(r'^app01/',include('app01.urls')),
    url(r'^app02/',include('app02.urls'))
    # 注意事项:总路由里面的url千万不能加$结尾
]

# 子路由
    # app01 urls.py
  from django.conf.urls import url
  from app01 import views

  urlpatterns = [
      url(r'^reg/',views.reg)
  ]
  # app02 urls.py
  from django.conf.urls import url
  from app02 import views

  urlpatterns = [
      url(r'^reg/',views.reg)
  ]
复制代码

 

  名称空间

    当多个应用出现相同的别名时,反向解析就没办法识别了,为解决这种情况而使用名称空间。

复制代码
     # 总路由
    url(r'^app01/',include('app01.urls',namespace='app01')),
    url(r'^app02/',include('app02.urls',namespace='app02'))
  # 解析的时候
      # app01
      urlpatterns = [
    url(r'^reg/',views.reg,name='reg')
        ]
    # app02
    urlpatterns = [
    url(r'^reg/',views.reg,name='reg')
        ]
    
      reverse('app01:reg')
    reverse('app02:reg')
    
    {% url 'app01:reg' %}
    {% url 'app02:reg' %}
# 其实只要保证名字不冲突 就没有必要使用名称空间
"""
一般情况下 有多个app的时候我们在起别名的时候会加上app的前缀
这样的话就能够确保多个app之间名字不冲突的问题
"""
urlpatterns = [
    url(r'^reg/',views.reg,name='app01_reg')
]
urlpatterns = [
    url(r'^reg/',views.reg,name='app02_reg')
]
复制代码

 

  虚拟环境

    在正常开发中 我们会给每一个项目配备一个该项目独有的解释器环境,该环境内只有该项目用到的模块,用不到一概不装。

    你每创建一个虚拟环境就类似于重新下载了一个纯净的python解释器。

 

posted @   临江沂水  阅读(68)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示