Django 路由系统简述
admin
2023-07-29 06:21:47
0

在前面的例子里面,我们已经了解,Django里面可以通过在Project同名的那个目录下的urls.py文件里面配置路由,根据用户输入的url,调用不同的函数或者类的方法。下面看看具体的一些例子。


单一的路由对应关系这种方式最直接,前面已经多次出现, 可以是fbv或者cbv类型的。


url(r'^login/', views.login)
url(r'^home/', views.Home.as_view()),


基于正则表达式的路由关系。具体来说,也可以分成两种:a. url(r'^detail-(\d+).html', views.detail) , 这里出现了一个分组(\d+),因此需要额外的再传递一个参数给detail这个函数,如果多个分组的话,需要按照顺序传递多个参数到detail函数b. url(r'^detail-(?P\d+)-(?P\d+).html', views.detail), 这里因为指定了nid和uid,因此传递参数的时候也需要指明具体是传递给谁的。c. 上面两种情况都可以通过万能参数实现 def detail(request, *args,**kwargs)


实战模板

        

url(r'^detail-(\d+)-(\d+).html', views.detail),
def func(request, nid, uid):
pass
def func(request, *args):
args = (2,9)
def func(request, *args, **kwargs):
args = (2,9)
   
#-----------------------------我是分割线------------------------------------ 
url(r'^detail-(?P\d+)-(?P\d+).html', views.detail)
def func(request, nid, uid):
pass
def funct(request, **kwargs):
kwargs = {'nid': 1, 'uid': 3}
def func(request, *args, **kwargs):
args = (2,9)




给路由的映射设置名称,这样更方便调用。reverse方法可以通过name倒过来找url的路径


url.py

url(r'^asdfasdfasdf/', views.index, name='i1'),
url(r'^yug/(\d+)/(\d+)/', views.index, name='i2'),
url(r'^buy/(?P\d+)/(?P\d+)/', views.index, name='i3'),

view.py

def func(request, *args, **kwargs):
    from django.urls import reverse
    url1 = reverse('i1')                              # asdfasdfasdf/
    url2 = reverse('i2', args=(1,2,))                 # yug/1/2/
    url3 = reverse('i3', kwargs={'pid': 1, "nid": 9}) # buy/1/9/

xxx.html

{% url "i1" %}               # asdfasdfasdf/
{% url "i2" 1 2 %}           # yug/1/2/
{% url "i3" pid=1 nid=9 %}   # buy/1/9/



多级app目录进行分类

如果存在多个app目录,每个app目录下面都可能存在同名的函数或者url,那么这种多级的路由方式,可以通过在主url文件中配置include指向各app目录下的子url文件,然后在app各自的目录下,再配置自己的url文件。


比如:

Django 路由系统简述

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^cmdb/', include("app01.urls")),
    url(r'^monitor/', include("app02.urls")),
]

Django 路由系统简述

url.py

urlpatterns = [
    url(r'^login/', views.login),
    url(r'^index/', views.index),
    url(r'^user_info/', views.user_info),
    url(r'^userdetail-(?P\d+)/', views.user_detail),
    url(r'^userdel-(?P\d+)/', views.user_del),
    url(r'^useredit-(?P\d+)/', views.user_edit),
    url(r'^orm/', views.orm),
]


views.py

def user_info(request):
    if request.method == "GET":
        user_list = models.UserInfo.objects.all()
        group_list = models.UserGroup.objects.all()
        return render(request, 'user_info.html', {'user_list': user_list, "group_list": group_list})
    elif request.method == 'POST':
        u = request.POST.get('user')
        p = request.POST.get('pwd')
        models.UserInfo.objects.create(username=u,password=p)
        return redirect('/cmdb/user_info/')


Django 路由系统简述


url.py

urlpatterns = [
    url(r'^login/', views.login),
]


view.py

def login(request):
    return HttpResponse('APP02,login')


访问不同app下的效果

Django 路由系统简述

Django 路由系统简述

Url里面还可以设置默认值,比如说我们可以定义一个字典

url(r'^index/', views.index, {'name': 'root'}),


在index这个函数里面,我们就可以直接调用这个默认值

def index(request,name):
print(name)
return HttpResponse('OK')



最后一个是命名空间,这个和前面的多级App分类刚好是反过来的。


比如,有两个不同的Url都指向了同一个App


urls.py

/admin/    include('app01.urls',namespace='m1')
/crm/      include('app01.urls',namespace='m2')

app01.urls

/index/    name = 'n1'

函数里面生成url的话,需要指定一条明确的路径

reverser('m1:n1')


相关内容

热门资讯

美媒曝:英国试图回欧盟参加部分... 美国彭博社7月3日报道称,随着双方试图重塑英国脱欧后的关系,英国正争取参与部分欧盟重要会议并在会上发...
18年前签的印度项目,遭拖欠上... 记者|文多编辑|何小桃 魏官红 易启江 校对|张益铭上海电气(601727.SH,股价6.96元,市...
朋友追忆西安赛格坠亡者生前细节 7月1日,西安赛格国际购物中心发生一起坠楼事件。坠楼者为陕西利和商贸有限公司负责人严某,该公司在赛格...
普京宣布俄军“完全解放”卢甘斯... 新华社莫斯科7月3日电(记者王作葵)俄罗斯总统新闻秘书佩斯科夫当地时间3日晚在临时召开的新闻发布会上...
日印又提“旗舰项目”,印度首条... 【文/观察者网 王恺雯】被视为日印合作“旗舰项目”的印度首条高铁,在经历了十多年征地受阻、工期延迟、...
阿根廷宣布撤销内政部 新华社布宜诺斯艾利斯7月3日电(记者张铎 王钟毅)阿根廷政府2日宣布撤销内政部,将其职能转移至内阁首...
热浪期间,法国家中死亡人数激增... 6月18日,在法国巴黎,人们在圣马丁运河水域消暑。新华社发上个月,欧洲遭遇了史上罕见的热浪袭击。根据...
日印各有所求,专家:双方的目标... 如何分析高市早苗此次访问中日印双方展现出的态度?两国关系可能面临哪些变量?凤凰卫视连线上海国际问题研...
二七区开展胡大白先进事迹专题宣... 7月1日,二七区邀请我校马克思主义学院党委副书记、工会主席韩树栋走进区委党校,开展胡大白董事长先进事...
台媒:谷立言与特朗普立场渐行渐... 前不久,台湾《中国时报》刊发社论指出,“美国在台协会”台北办事处处长谷立言对民进党“新两国论”几乎照...