zoukankan      html  css  js  c++  java
  • django 中的路由系统(url)

    路由系统

      根据Django约定,一个WSGI应用里最核心的部件有两个:路由表和视图。Django框架 的核心功能就是路由:根据HTTP请求中的URL,查找路由表,将HTTP请求分发到 不同的视图去处理:

    url() 函数有四个参数,两个必须的: regex view 两个可选的: kwargs 以及 name

    url() 参数: regex
        regex 是 regular expression 的简写,这是字符串中的模式匹配的一种语法, 在 Django 中就是是 url 匹配模式。 Django 将请求的 URL 从上至下依次匹配列表中的 正则表达式,直到匹配到一个为止。

    url() 参数: view

        当 Django 匹配了一个正则表达式就会调用指定的视图功能,包含一个 HttpRequest 实例作为第一个参数和正则表达式 “捕获” 的一些值的作为其他参数。 如果使用简单的正则捕获,将按顺序位置传参数;如果按命名的正则捕获,将按关 键字传参数值。 有关这一点我们会给出一个例子。

    url() 参数: kwargs
        任意关键字参数可传一个字典至目标视图。

    url() 参数: name

        对你的URL进行命名,可以让你能够在Django的任意处,尤其是模板内显式地引用它。相当于给URL取了个全局变量名,你只需要修改这个全局变量的值,在整个Django中引用它的地方也将同样获得改变。

    路由系统分类很多,常见的有基本单一路由,正则路由,带额外参数路由,二层三层路由还有通过反射机制来完成的动态路由。

    1、单一路由

    url(r'^index$', views.index),

    2、基于正则的路由

    利用正则表达式的分组方法,将url以参数的形式传递到函数

    url(r'^index/(d*)', views.index),
    url(r'^manage/(?P<name>w*)/(?P<id>d*)', views.manage),

    3、传递额外参数视图函数中(额外参数也称为关键字参数)

    url(r'^manage/(?P<name>w*)', views.manage,{'id':333}),

    4、为路由映射设置名称

    url(r'^home', views.home, name='h1'),
    url(r'^index/(d*)', views.index, name='h2'),

    设置名称之后,可以在不同的地方调用,如:

    • 模板中使用生成URL     {% url 'h2' 2012 %}
    • 函数中使用生成URL     reverse('h2', args=(2012,))      路径:django.urls.reverse
    • Model中使用获取URL  自定义get_absolute_url() 方法
    class NewType(models.Model):
        caption = models.CharField(max_length=16)
    
    
        def get_absolute_url(self):
            """
            为每个对象生成一个URL
            应用:在对象列表中生成查看详细的URL,使用此方法即可!!!
            :return:
            """
            # return '/%s/%s' % (self._meta.db_table, self.id)
            #
            from django.urls import reverse
            return reverse('NewType.Detail', kwargs={'nid': self.id})
    View Code

    获取请求匹配成功的URL信息:request.resolver_match

    5、根据app对路由规则进行分发

    url(r'^web/',include('web.urls')),

    6、命名空间

    a. project.urls.py

    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

    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

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

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

    • v = reverse('app01:detail', kwargs={'pk':11})
    • {% url 'app01:detail' pk=12 pp=99 %}

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

  • 相关阅读:
    Oracle分页问题
    win10系统vs2008环境wince项目无法创建问题
    工作满十年了
    让Vs2013 完美支持EF6.1 Code First with Oracle 2015年12月24日更新
    Oracle DMP 操作笔记之根据DMP逆向推导出导出的表空间名称
    【转】如何在 Eclipse 中進行 TFS 的版本管控
    【转】什麼是 Team Explorer Everywhere 2010 ?TFS 專用的 Eclipse 整合套件的安裝與設定
    [转]有关USES_CONVERSION
    [转]使用VC/MFC创建一个线程池
    IT男的”幸福”生活
  • 原文地址:https://www.cnblogs.com/freely/p/6914691.html
Copyright © 2011-2022 走看看