Django day03

互联网 2022/5/13 6:23:36

目录django 请求生命周期流程图路由层之路由匹配无名有名分组反向解析路由分发名称空间 django 请求生命周期流程图路由层之路由匹配 路由的特点:只要匹配上了就会立刻结束执行对应的视图函数并且url方法的第一个参数其实是一个正则表达式只要正则表达式能够从用户输入的…

目录
  • django 请求生命周期流程图
  • 路由层之路由匹配
  • 无名有名分组
  • 反向解析
  • 路由分发
  • 名称空间

django 请求生命周期流程图

路由层之路由匹配

路由的特点:
	只要匹配上了就会立刻结束执行对应的视图函数
	并且url方法的第一个参数其实是一个正则表达式
        只要正则表达式能够从用户输入的后缀中匹配到内容就算匹配上了

eg: 
1. test    
    正则是test  内容是test      可以匹配出test文本
    正则是test  内容是testxxx   还是可以匹配出test文本

演变过程
    正则是test/  内容是test  首次无法匹配
      # django二次追加斜杠机制
    即首次匹配不上 那么django还会让浏览器默认加斜杠再次发送请求
    test  	301		
    test/	200
    
    '''
    了解:
    	斜杠机制也可取消 但不推荐
    	APPEND_SLASH = False
    '''

2. test/  内容是xxxxtest/  也可以匹配test/
    可以在正则头部加^来限制
    '解决了路由前面可以乱写的问题'

3. ^test/  内容是test/xxx/xxx/	 也可以匹配出 ^test/
    可以在正则尾部加$来限制
    '解决了路由后面可以乱写的问题'

4. ^test$/	# 解决了路由前后乱写的问题

# 由于第一个参数是正则 所以当项目特别大 对应关系特别多时要格外注意否则会出现路由顶替的现象

拓展:
    可以定制一个主页面 用户不懈怠后缀可以直接访问
    url(r'^$', views.home)
    也可以定义一个尾页 用户输入一个没有对应关系的直接返回
    url('.*', views.error)
    
    

无名有名分组

url(r'^index/$', views.index)
'''
路由匹配成功之后就会调用视图函数
默认情况下会自动给是视图函数传递一个request位置参数
'''
def index(request):     
    return HttpResponse('from index view')
# 无名分组

url(r'^test/([0-9]{4})/$', views.test)
# 正则内()分组优先展示

'''
如果路由匹配中使用()对正则表达式进行了分组 
  那么在调用视图函数的时候
    会将()内匹配到的内容当作位置参数传递给视图函数
  	test(request, 括号内正则表达式匹配到的内容)
  	上述特性django称之为'无名分组'
'''
 def test(request, aaa):
     print('aaa:', aaa)	# aaa即为()内匹配到的内容
     return HttpResponse('from test view')
# 有名分组

url(r'^testxxx/(?P<user_id>[0-9]{4})/$', views.testxxx)
# 分组后起别名 (?P<别名>正则)
'''
给括号内的正则起别名后
  匹配成功则会将括号内匹配到的内容
    按照关键字参数传递给视图函数
    testxxx(request, user_id=括号内正则表达式匹配到的内容)
    上述特性django称之为'有名分组'
'''
def testxxx(request, user_id):
    print('user_id:', user_id)	# user_id即为()内匹配到的内容
    return HttpResponse('from testxxx view')
# 两者是否可以混合使用
url(r'^test/(\d+)/(?P<user_id>[0-9]{4})/$', views.testadd)  # 不可以
    
 无名有名分组不能混合使用!!! 单个可以重复使用

url(r'^test/(\d+)/(\d+)/$', views.testadd)   # 可以
url(r'^test/(?P<a>\d+)/(?P<b>\d+)',views.testadd)  # 可以
# 区别
无名分组 将匹配到的内容作为位置参数传给视图函数
		位置形参名自己随便取
有名分组 将匹配到的内容作为关键字参数传给视图函数
		传向的形参即为分组的别名	

反向解析

"""
a标签的href可以写网址的全称 也可以写后缀
	href='https://www.baidu.com'
	href='/login/'  # 自动补全当前服务的ip和port
	href='127.0.0.1:8000/login/'
"""
1.页面上有很多a标签链接了其他路由
2.路由匹配表达式出现了变化 html页面上的地址全部失效

# 反向解析
	通过反向解析可以获取到一个结果 该结果可以访问到一个路由
    
  步骤1:给对应关系起别名
    url(r'^func666/',views.func,name='func_view')
  步骤2:使用反向解析获取结果
    前端:
      	{% url 'func_view' %}  # func666/ 结果可以访问路由
    后端:
      	from django.shortcuts import reverse
      	reverse('func_view')  # func666/ 结果可以访问路由
# 无名分组反向解析
  步骤1:给对应关系起别名
    url(r'^func666/(\d+)/',views.func,name='func_view')
  步骤2:使用反向解析获取结果
    '''无法明确括号内正则表达式的内容 需要人为指定'''
    前端:
        {% url 'func_view' 123 %}  # func666/123/
    后端:
        from django.shortcuts import reverse
        reverse('func_view',args=(666,))  # func666/666/
# 有名分组反向解析
  步骤1:给对应关系起别名
    url(r'^func666/(?P<id>\d+)/',views.func,name='func_view')
  步骤2:使用反向解析获取结果
    '''无法明确括号内正则表达式的内容 需要人为指定'''
    前端:
      	{% url 'func_view' 123 %}  # func666/123/
        {% url 'func_view' id=123 %}  # func666/123/
    后端:
      	from django.shortcuts import reverse
      	reverse('func_view',args=(666,))  # func666/666/
        reverse('func_view',kwargs={'id':1})  # func666/1/
"""
疑问:无名有名反向解析中的手动传值 这个值在实际工作中到底可以是什么
	一般情况下这个值可以是数据的主键值、页面的页码、区域的编号等
"""

路由分发

"""
如果一个django项目特别庞大 里面有很多应用 每个应用下有很多对应关系 
那么django自带的路由层里面的代码就会非常非常的多 如何优化???
	根据应用的不同拆分到不同的应用中

django支持每个应用都可以有自己独立的
	路由层   模板层    静态文件   视图层(默认)   模型层(默认)
	urls.py templates static     views.py      models.py
上述特性能够让django在分组开发上更加的方便、快捷
	所有人都可以在应用中开发完整的项目功能
	最后汇总到一个空的django项目中 然后通过路由分发整合所有人的应用
"""
1.创建多个应用 并去配置文件中注册
'创建应用 startapp app_name'
	INSTALLED_APPS = [
    'app01',
    'app02'
]
    
2.在多个应用中编写相同的路由
  urlpatterns = [
    url(r'^index/',views.index111)
]
	urlpatterns = [
    url(r'^index/',views.index)
]
    
3.路由分发
  '总路由'
  from django.conf.urls import url, include
  from app01 import urls as app01_urls
  from app02 import urls as app02_urls
  url(r'^app01/',include(app01_urls)),
  url(r'^app02/',include(app02_urls))
  """总路由只负责分发 不负责视图函数对应"""

  上述代码还可以简写
  from django.conf.urls import url, include
  url(r'^app01/',include('app01.urls')),
  url(r'^app02/',include('app02.urls'))

名称空间

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')
"""
名称空间其实是可有可无的知识 但是在实际工作中还是有不少程序员喜欢使用
""" 
随时随地学软件编程-关注百度小程序和微信小程序
关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。
本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。
[Django day03]http://www.zyiz.net/tech/detail-320577.html

赞(0)
关注微信小程序
程序员编程王-随时随地学编程

扫描二维码或查找【程序员编程王】

可以随时随地学编程啦!

技术文章导航 更多>