zoukankan      html  css  js  c++  java
  • django路由基本使用-6

    路由定义位置

    django的路由是定义在 urls.py 文件下的 urlpatterns 列表中的。 urls.py 文件是路由解析的入口。

    from django.conf.urls import url
    from . import views
    
    urlpatterns = [
        url(r'^', views.index, name="index")
    ]
    

    一般每个子应用为了独立,都有自己的 urls.py 来保存该应用的路由,然后使用 include 函数把子路由包含在主路由中。

    # 子路由
    from django.conf.urls import url
    from . import views
    
    urlpatterns = [
        url(r'^', views.index, name="index")
    ]
    
    # 使用include函数把子路由包含在主路由中
    from django.conf.urls import url, include
    from django.contrib import admin
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^demo/', include("demo.urls"))
    ]
    

    也可以把所有的路由都定义在主路由中,子应用不再设置。

    from django.conf.urls import url
    from django.contrib import admin
    
    from demo.views import index
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^demo/', index)
    ]
    

    路由的解析顺序

    django的路由解析是从上到下的,django接收到一个请求后,他会从主工程的路由文件中 urls.py下的 urlpatterns 列表从上到下匹配,匹配到一个符合规则的路由,会执行后边的函数。如果后边是 include 函数,则会进入包含的子路由中,从上到下匹配。

    如果django匹配到一个符合规则的路由,会立即执行后面的函数,而不会继续向下执行。所以,当上边的匹配规则如果包含了下边的规则,可能会把下边的路由屏蔽掉。

    urlpatterns = [
        url(r'^say', views.say),
        url(r'^sayhello', views.sayhello),
    ]
    

    即使访问 sayhello 路径,他也会进入到 say 函数执行,因为他先匹配成功了 say 的路由规则。

    所以定义路由规则描述要准确,或者用 / 结尾。

    路由命名

    在定义路由的时候,可以指定第三个参数,来为路由起别名

    1. 使用 include 定义的路由时,在 include 函数中使用关键字参数 namespace 定义命名空间
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^demo/', include("demo.urls", namespace="demo"))
    ]
    
    - 命名空间的作用:避免不同应用中的路由使用了相同的名字发生冲突,使用命名空间区别开。
    
    1. 只使用 url 定义路由时,使用关键字参数 name 定义路由名字
    urlpatterns = [
        url(r'^', views.index, name="index")
    ]
    

    reverse反解析

    使用reverse函数,可以根据路由名称,返回具体的路径,如:

    from django.core.urlresolvers import reverse  # 注意导包路径
    
    def index(request):
        return HttpResponse("hello world!")
    
    def say(request):
        url = reverse('users:index')  # 返回 /users/index/
        print(url)
        return HttpResponse('say')
    
    • 对于未指明namespace的,reverse(路由name)

    • 对于指明namespace的,reverse(命名空间namespace:路由name)

  • 相关阅读:
    RTP 控制协议
    非关系型数据库
    关系型数据库
    处理海量数据
    处理大并发
    C++ 模板偏特化-来自STL的思考
    C++详解new/delete
    二分算法来相会
    计算机网络知识点总结
    C++字符串类型转换
  • 原文地址:https://www.cnblogs.com/mxuanli/p/9814694.html
Copyright © 2011-2022 走看看