zoukankan      html  css  js  c++  java
  • Django入门2:路由系统

    1、单一路由对应

      url(r'^index/', views.index), # FBV
      url(r'^home/', views.Home.as_view()), # CBV

    2、基于正则的路由

     1 url(r'^detail-(d+).html', views.detail),
     2 
     3 url(^'^detail-(d+)-(d+).html',views.detail),
     4 '''
     5 严格按照位置参数的顺序传入参数,如果在实际环境中,def detail(request,nid,uid)在定义时,参数的指定出现差错,则会导致下面的对参数的引用出现错误。
     6 '''
     7 
     8 url(r'^detail-(?P<nid>d+)-(?P<uid>d+).html', views.detail),
     9 '''
    10 传参时确保了nid=第一个传入的位置参数,uid=第二个传入的位置参数。
    11 '''

      实例1:实现 ?nid={{ id }}的url:

     1 from django.conf.urls import url
     2 from django.contrib import admin
     3 from app01 import views
     4 
     5 urlpatterns = [
     6     url(r'^admin/', admin.site.urls),
     7     url(r'^login',views.login),
     8     url(r'^index',views.index),
     9     url(r'^detail',views.detail),
    10     # url(r'^detail-(d+).html',views.detail),
    11     url(r'^home',views.Home.as_view()),  #对应类Home的对应方法
    12 ]
    urls.py:
     1 USER_DICT={
     2     '1':{'name':'root1','email':'root@live.com'},
     3     '2':{'name':'root2','email':'root@live.com'},
     4     '3':{'name':'root3','email':'root@live.com'},
     5     '4':{'name':'root4','email':'root@live.com'},
     6     '5':{'name':'root5','email':'root@live.com'},
     7 }
     8 
     9 def detail(request):
    10     nid=request.GET.get('nid',None)
    11     detail_info=USER_DICT[nid]
    12     return render(request,'detail.html',{'detail_info':detail_info})
    views.py:
     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>Title</title>
     6 </head>
     7 <body>
     8     <h1>详细信息</h1>
     9     <h6>用户名:{{ detail_info.name }}</h6>
    10     <h6>邮箱:{{ detail_info.email }}</h6>
    11 </body>
    12 </html>
    detail.html:
     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>Title</title>
     6 </head>
     7 <body>
     8 
     9     <ul>
    10         {% for k,v in user_dict.items %}
    11             <li><a target=_blank href="/detail?nid={{ k }}">{{ v.name }}</a></li>
    12         {% endfor %}
    13     </ul>
    14 
    15 </body>
    16 </html>
    index.html:

      实例2:实现url-{{ id }} 以这种方式用正则表达式取页面。

     1 from django.conf.urls import url
     2 from django.contrib import admin
     3 from app01 import views
     4 
     5 urlpatterns = [
     6     url(r'^admin/', admin.site.urls),
     7     url(r'^login',views.login),
     8     url(r'^index',views.index),
     9     # url(r'^detail',views.detail),
    10     url(r'^detail-(d+).html',views.detail),
    11     url(r'^home',views.Home.as_view()),  #对应类Home的对应方法
    12 ]
    urls.py:
     1 USER_DICT={
     2     '1':{'name':'root1','email':'root@live.com'},
     3     '2':{'name':'root2','email':'root@live.com'},
     4     '3':{'name':'root3','email':'root@live.com'},
     5     '4':{'name':'root4','email':'root@live.com'},
     6     '5':{'name':'root5','email':'root@live.com'},
     7 }
     8 
     9 def detail(request,nid):
    10     # nid=request.GET.get('nid',None)
    11     detail_info=USER_DICT[nid]
    12     return render(request,'detail.html',{'detail_info':detail_info})
    views.py:
     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>Title</title>
     6 </head>
     7 <body>
     8     <h1>详细信息</h1>
     9     <h6>用户名:{{ detail_info.name }}</h6>
    10     <h6>邮箱:{{ detail_info.email }}</h6>
    11 </body>
    12 </html>
    detail.html:
     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>Title</title>
     6 </head>
     7 <body>
     8 
     9     <ul>
    10         {% for k,v in user_dict.items %}
    11             <li><a target=_blank href="/detail-{{ k }}.html">{{ v.name }}</a></li>
    12         {% endfor %}
    13     </ul>
    14 
    15 </body>
    16 </html>
    index.html:

    3、为路由映射设置名称
    对URL路由关系进行命名, ***** 以后可以根据此名称生成自己想要的URL *****

     1 url(r'^asdfasdfasdf/', views.index, name='i1'),
     2 对应在index.html中:
     3 <form action="{% url "i1" %}" method="POST">
     4 
     5 url(r'^index/(d+)/(d+)/', views.index, name='i2'),
     6 对应在index.html中:
     7 <form action="{% url "i2" 1 2 %}" method="POST">
     8 
     9 url(r'^index/(?P<pid>d+)/(?P<nid>d+)/', views.index, name='i3'),
    10 对应在index.html中:
    11 <form action="{% url "i3" pid=1 nid=9 %}" method="POST">
    12 
    13 # 获取当前的URL
    14 request.path_info
    15 
    16 
    17 # 在函数中生成URL
    18 def func(request, *args, **kwargs):
    19 from django.urls import reverse
    20 
    21 url1 = reverse('i1') # asdfasdfasdf/
    22 url2 = reverse('i2', args=(1,2,)) # index/1/2/
    23 url3 = reverse('i3', kwargs={'pid': 1, "nid": 9}) # index/1/9/

    4、多级路由:根据app对路由规则进行分类
    客户端请求先到project/urls.py中进行匹配,匹配到下面的各个app的app/urls.py中。

    1 from django.conf.urls import url,include
    2 from django.contrib import admin
    3 
    4 urlpatterns = [
    5 url(r'^cmdb/', include("app01.urls")),
    6 url(r'^monitor/', include("app02.urls")),
    7 ]
    project/urls.py
    1 from django.conf.urls import url,include
    2 from django.contrib import admin
    3 from app01 import views
    4 
    5 urlpatterns = [
    6 url(r'^login/', views.login),
    7 ]
    app01/urls.py
    1 from django.conf.urls import url,include
    2 from django.contrib import admin
    3 from app02 import views
    4 
    5 urlpatterns = [
    6 url(r'^login/', views.login),
    7 ]
    app02/urls.py

    5、默认值

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

    1 def index(request,name):  
    2     print(name)
    3     return HttpResponse('OK')
    views.py

     在url中添加额外的参数后,在对应的视图函数中必须设置相应的形式参数name。在执行该方法时会自动传入默认值‘root'作为实参。

    6、命名空间

    a. project.urls.py

    1
    2
    3
    4
    5
    6
    from django.conf.urls import url,include
     
    urlpatterns = [
        url(r'^a/', include('app01.urls', namespace='author-polls')),
        url(r'^b/', include('app01.urls', namespace='publisher-polls')),
    ]

    b. app01.urls.py

    1
    2
    3
    4
    5
    6
    7
    from django.conf.urls import url
    from app01 import views
     
    app_name = 'app01'
    urlpatterns = [
        url(r'^(?P<pk>d+)/$', views.detail, name='detail')
    ]

    c. app01.views.py

    1
    2
    3
    def detail(request, pk):
        print(request.resolver_match)
        return HttpResponse(pk)

    以上定义带命名空间的url之后,使用name生成URL时候,应该如下:

    • v = reverse('author-polls:detail', kwargs={'pk':11})
    • {% url 'author-polls:detail' pk=11 %}

    django中的路由系统和其他语言的框架有所不同,在django中每一个请求的url都要有一条路由映射,这样才能将请求交给对一个的view中的函数去处理。其他大部分的Web框架则是对一类的url请求做一条路由映射,从而是路由系统变得简洁。

  • 相关阅读:
    Solution -「CF 1025G」Company Acquisitions
    Solution -「Code+#4」「洛谷 P4370」组合数问题 2
    YApi,顶尖API接口管理平台
    Hibernate (开放源代码的对象关系映射框架)
    【LeetCode】5. 最长回文子串
    【LeetCode】105. 从前序与中序遍历序列构造二叉树
    【LeetCode】76. 最小覆盖子串
    【LeetCode】974. 和可被 K 整除的子数组
    【LeetCode】394. 字符串解码
    【LeetCode】5424. 数组中两元素的最大乘积
  • 原文地址:https://www.cnblogs.com/zoe233/p/7610774.html
Copyright © 2011-2022 走看看