django(路由层)

一、简介

# 路由匹配
url(r'test',views.test),
url(r'test_add',views.test_add)
# r'test'与请求头的数据进行正则匹配

'''
url方法第一个参数是正则表达式
    只要第一个参数正则表达式能够匹配到内容,那么就会立刻停止往下匹配
    直接执行对应的视图函数
    
在输入url的时候默认加斜杠
    django内部帮你做到重定向
        一次匹配不行
        url后面加斜杠再来一次(浏览器加/后,再请求)
'''

        
# 取消自动加斜杠
APPEND_SLASH = False   # 默认是True,自动加斜杠

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    # 首页
    url(r'^$',views.home),
    url(r'^test/$',views.test),
    url(r'^test_add$',views.test_add),
    # 尾页(了解)
    url(r'',views.error)
]

二 无名分组

分组:就是给某一段正则表达式用小括号括起来
url(r'^test/(\d+)',views.test)
def test(request,xx):
    print(xx) # xx位置参数就是(\d+)匹配到的数字
    return HttpResponse('TEST')

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

三 有名分组

可以给正则表达式起一个别名,\d+的别名就是year
url(r'^test_add/(?P<year>\d+)',views.test_add)
def test_add(request,year):
    print(year)
    return HttpResponse('TEST_ADD')

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

四 无名和有名不能混用

# 无名有名不可以混用,但同一个分组可以使用N次
url(r'^test/(\d+)/(\d+)/(\d+)', views.test),
url(r'^test_add/(?P<year>\d+)/(?P<year>\d+)/(?P<year>\d+)', views.test_add),

五 反向解析

# 通过一些方法得到一个结果,该结果可以直接访问对应的url触发视图函数

# 先给路由与视图函数起一个别名,别名不能起冲突(和static令牌的原理一样)
url(r'^func/',views.func,name='ooo')
# 反向解析
    # 后端反向解析
    from django.shortcuts import render, HttpResponse, redirect,reverse
    reverse('ooo')
    
    # 前端反向解析
    <a href="{% url 'ooo' %}">111</a>

六 无名有名分组向反向解析

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

# 前端
{% url 'xxx' 123 %}

# 后端
reverse('xxx',args=(1,))

'''
这个数字写代码的时候应该放什么
    数字一般情况下放的是数据的主键值   数据的编辑和删除

伪代码(数据的编辑和删除),前端数据反向解析给url
def edit(request,edit_id)
    reverse('xxx',args=(edit_id))

listuser.html 数据展示页
{%for user_obj in user_queryset %}
    <a href="{% url 'xxx' user_obj.id %}">编辑</a>
{%endfor%}
点击编辑后,user_obj.id,反向解析,传给url,r'^edit_user/(\d+)',数字传给视图函数edit.
'''
# 有名分组反向解析
url(r'^func/(?P<year>\d+)/',views.func,name='ooo')

# 前端
<a href="{% url 'ooo' year=123 %}">有名分组,写法1</a>
<a href="{% url 'ooo' 123 %}">有名分组,写法2,简便写法</a>

# 后端
    # 有名分组反向解析  写法1
    print(reverse('ooo', kwargs={'year': 123}))
    # 简便写法
    print(reverse('ooo',args=(111,)))

七 路由分发

django的每一个应用都可以有自己的templates文件夹、urls.py、static文件夹
基于上述特点,django能够做到分组开发(每个人写自己的app)
作为组长,只需要将手下书写的app全部拷贝到一个新的django项目中,

然后在配置文件里,注册所有的app再利用路由分发的特点将所有的app整合起来。

当一个django项目中的url特别多的时候,总路由url.py代码非常冗余不好维护,这个时候也可以利用路由来减轻总路由的压力。

利用路由分发之后,总路由不再干路由与视图函数的直接对应关系
而是做一个分发处理,识别当前url是属于那个应用下的,直接分发给对应的应用去处理。

# 总路由
# from app01 import urls as app01_urls
# from app02 import urls as app02_urls

urlpatterns = [
    url(r'^admin/', admin.site.urls),

# 路由分发
    # url(r'^app01/', include(app01_urls)),  # 只要url前缀是app01开头 全部交给app01处理
    # url(r'^app02/', include(app02_urls)),

# 终极写法,推荐使用
    url(r'^app01/',include('app01.urls')),
    url(r'^app02/',include('app02.urls'))
# 注意事项:总路由里面的url千万不能加$结尾
]

# 子路由
from app01 import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^reg/', views.reg)
]

八 名称空间(了解)

# 当多个应用出现了相同的别名,研究反向解析会不会自动识别应用前缀
# 总路由
    # 终极写法,推荐使用
    url(r'^app01/',include('app01.urls',namespace='app01')),
    url(r'^app02/',include('app02.urls',namespace='app02'))
    # 注意事项:总路由里面的url千万不能加$结尾
]

# 解析的时候
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^reg/', views.reg,name='reg')
]

def reg(request):
    # print(reverse('reg'))
    print(reverse('app01:reg'))
    return HttpResponse('app01 reg')

def reg(request):
    # print(reverse('reg'))
    print(reverse('app02:reg'))
    return HttpResponse('app02 reg')

# 只要保证名字不冲突,就没必要使用名称空间

'''
一般情况下,有多个app的时候,起别名的时候会加上app的前缀
这样的话能够确保多个app之间名字不冲突的问题,解决 反向解析时不会出错。
'''

九 伪静态(了解)

静态网页
数据是写死的,万年不变

伪静态
将一个动态网页伪装成静态网页

为什么要伪装
https://www.cnblogs.com/Dominic-Ji/p/10881214.html
伪装的目的在于增大本网站的seo查询力度
并且增加搜索引擎收藏本网站的概率

搜索引擎的本质上就是一个巨大的爬虫程序

总结:
无论你怎么优化,怎么处理
始终还是干不过RMB玩家

url(r'^reg.html/', views.reg,name='reg')

 十  更多详细参考

https://www.cnblogs.com/xiaoyuanqujing/articles/11642628.html

 
posted @ 2023-07-29 21:39  coder雪山  阅读(22)  评论(0编辑  收藏  举报