zoukankan      html  css  js  c++  java
  • 005--Django2.0的路由层

    URL配置就像Django所支撑的网站目录,它的本质是每条URL调用的视图函数的映射表,每一个请求执行对应的视图函数。

    1、简单的路由配置 
     1 from django.contrib import admin
     2 from app01 import views
     3 from django.urls import path, re_path,include
     4 # 与django1版本不同的是django2版本是path和 re_path。re_path支持正则,和django1版本的url一样的效果。include是路由分发用的。分发给每个app
    5 6 urlpatterns = [ 7 path('admin/', admin.site.urls),
    00 re_path('^$',views.index)    # 直接写开头和结尾两个匹配字符,代表ip加端口模式
    8 re_path(r'^articles/2003/$', views.special_case_2003), # 以article开头和以2003结尾的都可以匹配的到 9 re_path(r'^articles/([0-9]{4})/$', views.year_archive), # 对应函数接收时,多一个参数 year_archive(request,year) 10 re_path(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive), # 对应函数接收时,多两个参数 month_archive(request,year,month)

    注意:若要从URL捕获一个值,只需要在他周围放置()。开头也不需要加/ ,因为每个url都会自动加上。例如^articles,而不是^/articles。每个正则表达式前面的r代表不转义的意思。告诉python这个字符串是原始的,不需要任何转义。

    2、有名分组 

    上面的示例中使用简单的、没有命名的正则表达式组(通过括号)来捕获url值,并以位置参数传递给视图。在高级用法中,可以给正则表达式命名。这样就是以关键字参数传递给视图,在python中,命名正则表达式的语法是(?P<name>pattren)

    name是组的名称。pattern是要匹配的模式。

    1     # 命名分组
    2     re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive), #year_archive(request,month=month,year=year)  以关键字参数传递给视图,位置可调换。
    3、路由分发 

     当一个项目有好多条url和好多应用时,就要设计好,运用include路由分发到不同app里面,这样看起来也舒服,全写在主url太多了。

    1     # 分发
    2     re_path(r'^',include('app01.urls')),
    3     re_path(r'^app01/',include('app01.urls')),      # 以app01开头。然后分发到app01下的urls文件
    4     re_path(r'^app02/',include('app02.urls')),      # 以app02开头。然后分发到app02下的urls文件
    4、反向解析 

     django项目也有用于嵌入到生产内容中、比如视图和模版里的url等。或者重定向等。如果你项目之前设计好了url.,项目完成后或者上线后,老板要求你改url,后面的视图和模版也要跟着改,实在麻烦,所以有了反向解析。不再采取硬编码的url。

    1     # 反向解析
    2     re_path('^login/$', views.login, name='login'),# name代表名称。

    3 re_path(r'^articles/([0-9]{4})/$', views.year_archive,name='y_a'), # 带参数的url反向解析
    
    
    
    
    
    
    <!--语法{% url 'name' %} name对应urls.py里的每条url后面的name变量,这样,就算url规则改了,form表单里会自动反向解析那条修改的url。-->
    <form action="{% url 'login' %}" method="post">
        用户名:<input type="text" name="user">
        密码:<input type="password" name="pwd">
        <input type="submit" value="登陆">
    </form>
    <a href="{% url 'y_a' 2012 %}">2012 Archive</a>
    
    <ul>
    {% for yearvar in year_list %}
    <li><a href="{% url 'y_a' yearvar %}">{{ yearvar }} Archive</a></li>
    {% endfor %}
    </ul>
     1 from django.shortcuts import render, HttpResponse,redirect
     2 # django的三种响应方式,render是渲染一个页面,Httpresponse是返回一个字符串,redirect重定向
     3 
     4 # Create your views here.
     5 
     6 def special_case_2003(request):
     7 
     8     url=reverse('s_c_2003')
     9     print(url)
    00 year=2000
    10 print(reverse('y_a',args=(year,))) # 如果要传递参数,后面跟元祖, 11 return HttpResponse("Hello Python") 12 13 def index(request): 14 print(reverse('app01:index')) # app01下对应的name是index的url 15 return HttpResponse('app01的index')
    4、名称空间 

     名称空间:namespace,当不小心在不同的app的urls中定义相同的name时,可能会导致URL反解错误,为了避免这种事情发生,引入了命名空间。

        # 名称空间:include放一个元祖
        re_path(r'^app01/', include(('app01.urls', 'app01'))),
        re_path(r'^app02/', include(('app02.urls', 'app02'))),
     1 app01.urls:
     2 
     3 urlpatterns = [
     4 re_path(r'^index/', views.index,name="index"),
     5 ]
    6 app02.urls: 7 8 urlpatterns = [ 9 re_path(r'^index/', views.index,name="index"), 10 ]
     1 app01.views
     2 
     3 from django.core.urlresolvers import reverse
     4 def index(request):
     5   return HttpResponse(reverse("app01:index"))
     6 app02.views
     7 
     8 from django.core.urlresolvers import reverse
     9 def index(request):
    10   return HttpResponse(reverse("app02:index"))
  • 相关阅读:
    C/C++程序内存的分配
    【解题报告】UVA101 The Blocks Problem
    洗牌算法
    【持续更新】算法竞赛常用模板
    北京邮电大学2021乐理公共选修课期末考试
    Oracle通用大数据量存储过程分页修正版
    (转)NHibernate 3.0在PetShop 3层架构中的应用
    Json.Net学习笔记
    JS获得浏览器高度和宽度参数
    jQuery数组处理汇总
  • 原文地址:https://www.cnblogs.com/xjmlove/p/9891335.html
Copyright © 2011-2022 走看看