django,路由层

Django请求生命周期

路由层

路由分配

路由匹配的特点是 只要匹配上了就会立刻结束执行对应的视图函数
在urls.py文件中的url方法的第一个参数其实是一个正则表达式
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'index/', views.index),
    url(r'login/', views.login),
]
这里面的r'^admin/',r'index/'和r'login/'都是正则表达式,也就是说只要我们能匹配到r''里面
的内容就可以执行相应的视图函数。
输入http://127.0.0.1:8000/login,出现的是login页面,但是输入login2,出现的还是login
页面,这是因为Django会将匹配成功的返回,不会继续往下匹配
如:
	
  正则是test/ 内容是abcdefgtest/ 那么可以匹配出文本test/ 那么就可以通过abcdefgtest/执行对应视图函数。
  	可以在正则的最前面加上上箭头来限制
  	'''解决路由前面可以随意乱写的问题'''
    
  正则是^test/ 内容是test/abc/edf/acd/ 那么可以匹配出文本test/
  	可以在正则的最后面加上$来限制
    '''解决路由后面可以随意乱写的问题'''

  正则是^test/$ 此时内容只有是test/ 才能执行对应的视图函数。


可以定制一个主页面 用户不携带后缀可以直接访问(掌握)
    url(r'^$',views.home)
也可以定义一个尾页 用户输入一个没有对应关系的直接返回(了解)
    url(r'',views.error)

无名分组

同样的既然可以进行正则匹配,那么就可以写更多的正则语法:
urlpatterns = [
 url(r'^login/[0-9]{4}$',views.login),
]

就是login/ 后面随意加上4位数字都可以访问login页面

同样的正则还有分组的概念,但是在Django中把分组分为两种:无名分组和有名分组

无名分组:
  urlpatterns = [
   url(r'^login/([0-9]{4})$',views.login),
  ]
在普通的正则匹配中加上()就是无名分组

首先在后端的views.py上,会得到一个分组的参数,以上面代码为例,那么views.login函数的参数除
了request,还需要添加一个参数(名字随意),进行几次分组那么就需要多添加几次参数

进入views.py页面,其中xxx的名字是随意的,传进来的分组的数据例如我输入的网址是:login/222,那么xxx的值为222

  def login(request,xxx):
   print(xxx)

有名分组

那既然知道了无名分组是什么,那么有名分组其实就是在无名的分组的基础上加上了名字。
urlpatterns = [
 url(r'^login/(?P<year>[0-9]{4})$',views.login),
]
语法为:(?P<名字> 正则表达式),就是在无名分组的括号里面加上了?P<名字>,注意其中P为大写
既然有了名字,那么在views页面就不能给函数传递随意的参数了:
  def login(request,year):
   print(year)

第二个参数year是urls.py页面命名的名字:

反向解析

试想一个场景,你有200多个a标签,href都指向index/,有一天在urls里面index改为了
new_index,那么你只能手动改变a标签中的href,当你改完,又变成了my_index,那么一天的时间都
可能在改地址,那么有没有什么方法,不再把程序写死,反向解析就是应用于此。
1:给对应关系起别名
  url(r'^index/$',views.index,name='app01_index')

前端反向解析
  {% url 'app01_index' %} # {% url '放urls.py中路由与视图函数的name的值' %} 
后端反向解析
  from django.shortcuts import reverse #需要导入模块
  def index(request):
    reverse('app01_index') #放urls.py中路由与视图函数的name的值
    return HttpResponse('index')

无名分组反向解析

步骤1:给对应关系起别名
    url(r'^index/(\d+)/',views.func,name='func_index')
  步骤2:使用反向解析获取结果
    '''无法明确括号内正则表达式的内容 需要人为指定'''
    前端:
      	{% url 'func_index' 123 %}  # {% '放urls.py中路由与视图函数的name的值' 123((\d+)这个分组能匹配到的内容) %} 
    后端:
      	from django.shortcuts import reverse
      	reverse('func_index',args=(123,))  

有名分组反向解析

步骤1:给对应关系起别名
    url(r'^index/(?P<id>\d+)/',views.func,name='func_index')
  步骤2:使用反向解析获取结果
    '''无法明确括号内正则表达式的内容 需要人为指定'''
    前端:
      	{% url 'func_index' 123 %}  
        {% url 'func_index' id=123 %}  
    后端:
      	from django.shortcuts import reverse
      	reverse('func_view',args=(666,)) #推荐使用这种 
        reverse('func_view',kwargs={'id':1})  

案例:
前端
  <a href="{{ res }}">login</a>
  <a href="{% url 'app01_login' 123 %}">login</a>
后端
urls.py:
urlpatterns = [
    url('^index/(\d+)$',views.index,name='app01_index'),
    url('^login/(?P<id>\d+)$',views.login,name='app01_login')
]

views.py:
def index(request,xxx):
    print(xxx)
    res = reverse('app01_login',args=(333,))
    return render(request,'index.html',{'res':res})

路由分发

当django项目特别庞大的时候 如果所有的路由匹配都写在项目的总路由中会导致总路由过于复杂不
利于维护 此时可以将路由做拆分
"""
django支持所有的应用都可以拥有自己的
	urls.py 
	templates文件夹 
	static文件夹
也就意味着多人协同开发变得更加的简单了
"""
如何将多个单独的app组织到一起 >>> 路由分发

# 总路由
from app01 import urls as app01_urls
from app02 import urls as app02_urls
from django.conf.urls import url,include
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处理
]

# 子路由 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)
  ]

路由分发终极写法(推荐使用)

# 总路由
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'))
    # 注意事项:总路由里面的url千万不能加$结尾
]

名称空间

1.不同的应用使用了相同的别名 那么反向解析是否自动识别
	index_view				app01/index/
        index_view				app02/index/
2.验证发现默认情况下是不会自动识别应用前缀的 如何解决反向解析问题
	方式1:名称空间
    	总路由添加名称空间
    url(r'^app01/',include('app01.urls',namespace='app01')),
    url(r'^app02/',include('app02.urls',namespace='app02'))
    	应用反向解析自动提示
      	reverse('app01:index_view')
        reverse('app02:index_view')
        {% url 'app01:index_view' %}
        {% url 'app02:index_view' %}
  方式2:只需要确保反向解析的别名在整个项目中不重复即可!!!
    	可以在别名的前面加上应用名的前缀
      	url(r'^index/',views.index,name='app01_index_view')
        url(r'^index/',views.index,name='app02_index_view')
posted @ 2022-05-12 23:27  春游去动物园  阅读(40)  评论(0编辑  收藏  举报