Django blog - Django url 介绍

Posted 全栈运维

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django blog - Django url 介绍相关的知识,希望对你有一定的参考价值。

Abstract



关于请求

这里简单说明下Django的请求原理

  • 用户发起request请求到Django服务

  • Django 服务通常会根据settings.py里面的配置ROOT_URLCONF来进行模块匹配。默认ROOT_URLCONF = 'myproject.urls'

  • Django 加载该 Python 模块并寻找可用的 urlpatterns 变量。该变量是一个 Python 列表,详见myproject/myproject/urls.py

  • Django 按照顺序的方式,正则匹配每一个URL模式,在第一个与请求的URL 匹配的地方停下来(下面也符合的会被忽视)。

  • 一旦匹配到,Django 将导入并调用给出的视图中涉及到的函数。

    视图将获得如下参数:

    • 如果正则匹配的 url 中使用了括号分组,但却没有为分组进行命名,则使用位置参数的模式为view函数传参。强烈建议使用关键字命名的分组

    • 一个HttpRequest 实例(这也是为什么 view 函数的第一个参数要是 request,该实例封装了所有的 http 请求报文的信息)

    • 如果是命名的分组,则使用关键字传参的方式。但是可以被django.conf.urls.url()的可选参数kwargs覆盖。

    • 如果没有匹配到正则表达式,或者如果过程中抛出一个异常,Django 将调用一个适当的错误处理视图。

    • 函数处理完毕,返回处理后的结果。


    urlpatterns

    前面讲到Django会加载Python模块最终寻找 urlpatterns 变量的配置,这里该变量有自己固有的配置方式。

    参考官网例子:

    from django.conf.urls import url
    
    from . import views
    
    urlpatterns = [
        url(r'^articles/2003/$', views.special_case_2003),
        url(r'^articles/([0-9]{4})/$', views.year_archive),
        url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
        url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
        url(r'^admin/', admin.site.urls),  ## 特殊URL
        url('r'^blog/', include('blog.urls', namespace='blog')) ## 包含APP URL
    ]
    • 每一行url()记录都是一类URL匹配模式

    • 每个正则表达式前面的r 是可选的但是建议加上。
       它是原始的,字符串中任何字符都不应该转义。

    • 不需要添加一个前导的反斜杠,因为django自动在域名后添加了/
       比如这里: 应该是^articles 而不是^/articles

    • 如上面的最后两个配置,admin和新增的APP blog的配置。/ 后面不需要添加$

    • 若要从 URL 中捕获一个值,只需要在它周围放置一对圆括号。也就是上面提到的命名分组(即正则中的分组匹配)


    命名分组

    我们强烈建议使用关键字命名分组

    举例如下:

    (?P<articleid>\d+) 这个分组表示匹配一个或多个(+ Python正则中代表一个或者多个)任意的数字(\d 代表匹配数字),并以 articleid = 匹配到的数字,如 articleid = ‘123’ 的方式传给view匹配到的函数。

    注意:

    url 捕获的所有参数都是字符串类型,虽然 \d 在正则中表示匹配数字,但传参的时候,传的都是字符串


    匹配/分组算法

    下面是URLconf 解析器使用的算法,针对正则表达式中的命名组和非命名组:

    1、如果有命名参数,则使用这些命名参数,忽略非命名参数。
    2、否则,它将以位置参数传递所有的非命名参数。
    3、命名分组不允许同名

    对于上面的第一条,举例验证如下:

    ## urls.py
    url(r'add/(\d+)/(?P<num1>\d+)/(?P<num2>\d+)/', add, name='add'),
    
    ## views.py
    def add(request, num1, num2):
        num1 = int(num1)
        num2 = int(num2)
        return HttpResponse(num1 + num2)

    实际返回的结果是 456+123=679 而不是 789+456+123=1368
    请自行实践操作验证哦


    url() 中的name

    name 可以用于在 templates, models, views ……中得到对应的网址,相当于给网址取了个名字,只要这个名字不变,网址变了也能通过名字获取到。

    举例说明:
    我们有如下URL请求

    url(r'add/(\d+)/(?P<num1>\d+)/(?P<num2>\d+)/', views.add, name='add'),

    在模板中存在一个add.html的页面

    <a href="{% url 'add' 4 5 %}">计算求和</a>
    # 这里的HTML的地址最终会被解析成
    <a href="/add/4/5">计算求和</a>
    url(r'new_add/(\d+)/(?P<num1>\d+)/(?P<num2>\d+)/', views.add, name='add'),

    只要我们上面的name='add' 不发生变化,HTML页面的中<a href="{% url 'add' 4 5 %}">计算求和</a> 将会自动解析成<a href="/new_add/4/5">计算求和</a>


    参考:
    https://docs.djangoproject.com/en/1.11/topics/http/urls/
    http://code.ziqiangxuetang.com/django/django-url-name.html

    以上是关于Django blog - Django url 介绍的主要内容,如果未能解决你的问题,请参考以下文章

    在 Django 模板中传递 *args

    Django 一对多关系 url

    django之创建第7-3个项目-在站点blog下单独创建urls.py文件

    django url.py使用

    Python Django的URL设置

    Django 获取绝对 URL