Django 的路由层URL 分组 路由分发 反向解析

URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码。

其实你运行这个django项目首先进入的就是urls中  由urls来决定你下一步的走向

    urlpatterns = [
         path(正则表达式, views视图函数,参数,别名),
]


参数说明:

    一个正则表达式字符串
    一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
    可选的要传递给视图函数的默认参数(字典形式)
    一个可选的name参数

在django1中  一般都是使用re来进行的匹配  django都是也可以使用re_path进行匹配 也可以使用path来进行设置

url的操作就是设置你的下一步的走向的设置  

分组

有名分组   可以设置你的路由的具体的名字

分发 ------>include 来把你的url内的路由地址设置为到底是谁的

反向解析 ----> reverse 搭配name 就是给你的路由起个名字让它确定具体的值 以后再改变其他的值 也不该变别名

基本url的匹配

from django.contrib import admin
from django.urls import path
from django.urls import re_path
from first import views
urlpatterns = [
    path('admin/', admin.site.urls),
    re_path('^index/',views.index),  #导入了re_path 就可以使用正则匹配进行匹配  前面是你的匹配条件  后面是匹配的内容  就是以index开头  从views.index内匹配

    re_path('^$',views.nice),  #这是你的请求框 url内不用输入任何信息只需要输入ip和端口就可以访问到 views内的nice函数

     re_path('^article/',views.article_year),
    re_path('^article/d{4}/$',views.article_year), #请求的内容是以article后面跟上4个数字开头的 匹配views.article_year函数

    re_path('^article/2003/d{2}$',views.lap),  #这是会有重叠覆盖的  其实你现在的内容已经被第一个覆盖了 第二个也被第一个覆盖了  因为只要是开头是article的就都走views内的article_year了  不管后面的匹配项了
]

url可以用re_path利用正则的方式来进行匹配  

一定要注意覆盖: 因为后面覆盖会伴随我们很久远  覆盖只要匹配到上面的一个就不会管下面的内容 就会覆盖下去

'''
    NOTE:
1、一旦匹配成功则不再继续
2、若要从URL 中捕获一个值,只需要在它周围放置一对圆括号。
3、不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles 而不是 ^/articles。
4、每个正则表达式前面的'r' 是可选的但是建议加上。

一些请求的例子:

    /articles/2005/3/ 不匹配任何URL 模式,因为列表中的第三个模式要求月份应该是两个数字。
    /articles/2003/ 将匹配列表中的第一个模式不是第二个,因为模式按顺序匹配,第一个会首先测试是否匹配。
    /articles/2005/03/ 请求将匹配列表中的第三个模式。Django 将调用函数
                       views.month_archive(request, '2005', '03')。
    '''

分组:

分组就是利用正则一样的方式进行你的匹配的条件进行分组匹配

  re_path('^article/(d{4})/(d{2})$',views.article_year),  #这个分组后你可以匹配到的是以article开头后面跟上分组后的4个数字
再跟上分组后的2个数字
  #article_year(request,2000,12)
  
  re_path('^article/(d{4})/(d{3})$',views.article_month),  #这个也是正常的无名分组
# article_month(request,2000,12)


其实分组就是利用正则的匹配来进行分组的设定

分组后的对应的视图内的函数接受的参数也必须根据你分组的个数来设定 ,如果你的匹配项 设定的分组 是3个 那么你的的视图内的对应函数也必须设置接收3个参数  才可以

注意:

同一个视图被分组匹配后它的接收参数就改变了

re_path('^nice/',views.article_year), #这个是时候你的视图内的article函数
已经改为了 接收分组后的 参数 所以
你也要传递进去3个参数 不然就会报错

有名分组:

有名分组就是在分组的时候就给你定义好了你分组的名字 这样防止你在视图内调换组内的信息而发生改变

re_path('^article/(?P<year>d{4})/(?P<month>d{2})/(?P<day>d{2})', views.article_day),  #这个就好比已经约定好了
它的分组内的名字你的视图无论
怎么改变接收的值都不会变的

这个就是规定好了 你的第一个传递的值的名字就是year 第二个值就是month 第三个就是day你的视图接收的顺序可以改变但是最后的结果不变

对应的视图views:

def article_day(request,year ,day,month):
    return HttpResponse(year+':'+month+':'+day)

虽然视图的接收的值的顺序不对 但是值还是不变的

切忌 :你分组后的起的名字在视图内的名字也必须是这个不能改变

路由分发:

就是把每一个单独的app就是新建立的模块的路由不放在了自带的urls内了 放在新建的app内 通过自带的urls内的路由分发去找每一个app内的路由

路由分发 首先你要在分发点 urls 内法如include模块

from django.urls import include

你的 总urls的设置

re_path('^first/', include('first.urls')),

你的app新建立的urls的设置

from django.contrib import admin
from django.urls import path,re_path,include
from first import views
urlpatterns = [
    re_path('^article/d{4}/$',views.special_year),
]

你访问的url

总之你的urls的访问的时候要先加上first指定路由来查找

路由分发就是你指定的路由  然后你访问的时候也必须要加上你设置的这个指定app的路由才可以进行的访问

反向解析:

就好比一天你访问了templace里面的html的页面后 要回去提交表单 这个时候突然有人把你的表单 action更改了你怎么办? 这时候我们起别名就可以防止出错

urls的设置

 re_path('login.html',views.login, name = 'lo_gin'),

views

def login(request):
    if request.method == 'POST':
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        if user == '老王' and  pwd == '123':
            url = reverse('lo_gin')  #你要再解析这个别名 然后执行下一步
            print('url',url)
            # return redirect(url)  #这个是重新定向
            return HttpResponse('登陆成功')
        else:
            return render(request,'login.html')
    return render(request,'login.html')

templace下的html文件

<form action="{% url 'lo_gin' %}" method = 'post'>
    用户名:<input type="text" name = 'user'/>
    密码: <input type="password"  name = 'pwd'/>
    <input type="submit">
</form>

需要你再分配路由的时候的url的时候用name起个别名  然后再templace里面的html进行{% url  '别名的设置'%}  在views里面对url进行reverse进行解析

 解析完成后才能走下一步

原文地址:https://www.cnblogs.com/zhaoyunlong/p/9215894.html