Django之URL

URL配置

URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表。你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码。

基本格式 

from django.conf.urls import url
#循环urlpatterns,找到对应的函数执行,匹配上一个路径就找到对应的函数执行,就不再往下循环了,并给函数传一个参数request,和wsgiref的environ类似,就是请求信息的所有内容
urlpatterns = [
     url(正则表达式, views视图函数,参数,别名),
]

参数说明:

正则表达式:一个正则表达式字符串

views视图函数:一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串

参数:可选的要传递给视图函数的默认参数(字典形式)

别名:一个可选的name参数

正则表达式

from django.conf.urls import url,include
from django.contrib import admin
from app01 import views
urlpatterns = [
    # url(r'^admin/', admin.site.urls),

    url(r'^articles/$', views.articles),
    # 匹配articles/
    url(r'^articles/2003/$', views.articles_2003),
    # 匹配articles/2003/
    url(r'^articles/(\d{4})/$', views.articles_year),
    # 匹配四位数字当做年份

]

views.py中视图函数的写法:

第一个参数必须是request,后面跟的三个参数是对应着上面分组正则匹配的每个参数的
def articles(request):
    return HttpResponse('文章')


def articles_2003(request):
    return HttpResponse('2003')


def articles_year(request, year):
    return HttpResponse(year)

test:

       

 

 注意事项

  1. urlpatterns中的元素按照书写顺序从上往下逐一匹配正则表达式,一旦匹配成功则不再继续。
  2. 若要从URL中捕获一个值,只需要在它周围放置一对圆括号(分组匹配)。
  3. 不需要添加一个前导的反斜杠(也就是写在正则最前面的那个/),因为每个URL 都有。例如,应该是^articles 而不是 ^/articles。
  4. 每个正则表达式前面的'r' 是可选的但是建议加上。
  5. ^articles&  以什么结尾,以什么开头,严格限制路径

补充说明

# 是否开启URL访问地址后面不为/跳转至带有/的路径的配置项
APPEND_SLASH=True

Django settings.py配置文件中默认没有 APPEND_SLASH 这个参数,但 Django 默认这个参数为 APPEND_SLASH = True。 其作用就是自动在网址结尾加'/'。其效果就是:我们定义了urls.py:

from django.conf.urls import url
from app01 import views

urlpatterns = [
        url(r'^blog/$', views.blog),
]

访问 http://www.example.com/blog 时,默认将网址自动转换为 http://www.example/com/blog/ 。

如果在settings.py中设置了 APPEND_SLASH=False,此时我们再请求 http://www.example.com/blog 时就会提示找不到页面。

分组命名匹配

其实上面的举例中也涉及到了分组命名,使用简单的正则表达式分组匹配(通过圆括号)来捕获URL中的值并以位置参数形式传递给视图。

from django.conf.urls import url

urlpatterns = [

    url(r'^articles/(\d{4})/(\d{1,2})/$', views.articles_year_month),
    # 匹配年月,年份是4位数字,月份是1位或2位数字
    url(r'^articles/(?P<year>\d{4})/(?P<month>\d{1,2})/$', views.articles_year_month),
    # 分组命名匹配
]

views.py写法:

def articles_year_month(request,month,year):

    return HttpResponse(year+month)

test:

 

视图函数中指定默认值

# urls.py中
from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^articles/$', views.articles2), # 默认显示2003
    url(r'^articles/(?P<year>\d{4})/$', views.articles2), # 用户输入任意四位数,会显示输入的数字
 ] 

# views.py中,可以为year指定默认值
def articles2(request, year='2003'):
return HttpResponse(year)

test:

     

 

include其他的URLconfs(也叫URL分发)

由于views和models文件都放在每一个app应用里面,而urls.py这个文件放在项目文件夹里面,导致所有的app都在使用它,如果你一个项目有10个应用,每个应用有100个url,那意味着你要在urls文件里面要写很多,并且所有的app的url都写在了这一个urls文件里面啊,这样好吗,当然也没有问题,但是耦合程度太高了,所以django在url这里给你提供了一个分发接口,叫做include条url对应关系。

# 在应用文件夹里面创建一个自己的urls路由文件
from
django.conf.urls import url,include from django.contrib import admin from app01 import views
urlpatterns
= [ # include #app01应用的 url(r'^app01/', include('app01.urls')), #app02应用的 url(r'^app02/', include('app02.urls')), ]

 

 

# urls
from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
    # url(r'^admin/', admin.site.urls),
    url(r'^index/(?P<year>\d+)/', views.index,{'foo':'xxxxx'}),

]


# views
def index(request, foo, year):
    print(foo)
    return HttpResponse('app01')
app01 urls和views
# urls
from django.conf.urls import url,include
from django.contrib import admin
from app02 import views

urlpatterns = [
    # url(r'^admin/', admin.site.urls),
    url(r'^index', views.index),

]

# views
from django.shortcuts import render,HttpResponse

# Create your views here.

def index(request):

    return HttpResponse('app02')
app02 urls和views

test:

    

传递额外的参数给视图函数(了解)

 URLconfs 具有一个钩子,让你传递一个Python 字典作为额外的参数传递给视图函数。

django.conf.urls.url() 函数可以接收一个可选的第三个参数,它是一个字典,表示想要传递给视图函数的额外关键字参数。

例如:

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive, {'foo': 'bar'}),#注意,这就像一个命名分组一样,你的函数里面的必须有一个形参,形参必须叫做foo才行,如果是命名分组的url,那么foo参数写在函数的哪个位置都行,如果不是命名分组,那么都是将这个形参写在参数的最后。
]

在这个例子中,对于/blog/2005/请求,Django 将调用views.year_archive(request, year='2005', foo='bar')。

这个技术在Syndication 框架中使用,来传递元数据和选项给视图。

 

posted @ 2019-05-17 17:56  blog_wu  阅读(173)  评论(0编辑  收藏  举报