首页 > 编程语言 > 详细

python之Django学习笔记(三)---URL调度/URL路由

时间:2019-04-10 15:40:14      阅读:108      评论:0      收藏:0      [点我收藏+]

在django中,用户发起url请求消息首先到工程的urls.py中查找是否有匹配的url路径

刚创建好的工程中urls.py只有下面几行代码:

from django.contrib import admin
from django.urls import path

urlpatterns = [
    path(admin/, admin.site.urls),
]

启动服务后,用户可以在网址中输入http://127.0.0.1:8000/admin/来访问系统

如果用户需要输入http://127.0.0.1:8000即可访问怎么办呢?(目前这个网址打开是一个默认欢迎页,可以在settings.py中把DEBUG设置为False)

可以在urlpatterns中增加如下代码:

from django.contrib import admin
from django.urls import path

urlpatterns = [
    path(admin/, admin.site.urls),
    path(‘‘,admin.site.urls)
]

再访问http://127.0.0.1:8000就可以了,当然我们可以在views.py中增加一个函数如下:

from django.http import HttpResponse

# Create your views here.
def welcomeTest(request):
    return HttpResponse(欢迎使用Django!)

然后在urls.py中引入views并使用views中的函数:

from django.contrib import admin
from django.urls import path
from djangoTestApp import views as djangoTestApp_views

urlpatterns = [
    path(admin/, admin.site.urls),
    path(‘‘,djangoTestApp_views.welcomeTest)
]

这样再打开http://127.0.0.1:8000就会显示我们设置的‘欢迎使用Django!’了

 

这就是django的url匹配模式,匹配模式还支持变量,比如在urls.py中增加如下代码:

path(<str:name>/<int:age>,djangoTestApp_views.userinfoTest)

在views.py中增加如下函数:

def userinfoTest(request,name,age):
    return HttpResponse(%s\‘s age is %d.%(name,age))

这时我们打开网址http://127.0.0.1:8000/watertaro/30/会得到下面的内容:

技术分享图片

其实请求消息中的参数最后转化为了djangoTestApp_views.userinfoTest(request,name = ‘watertaro‘,age = 30)

 

像int这样的转换类型还有如下:

str:包括任意的非空但不包括/的字符

int:包括0和任意整数

slug:包括数字、字母(大小写)以及连接符(-)和下划线(_)组成的任意字符串

uuid:格式化的uuid,只能为数字、小写字母和连接符(-)

path:包括任意非空字符和/字符

 

当然转换类型也可以自己写的,比如写一个固定4位年份的数字步骤如下:

1、先在urls.py文件同目录下创建一个文件converters.py,写一个如下类:

class Year4DigitConverter:
    regex = [0-9]{4}

    def to_url(self,value):
        return ‘%04d % value

regex这个变量是自定义转换类型必须的,否则执行会报错,函数to_url只是把value格式化成4位的int型数据

2、在urls.py中导入和增加如下代码:

from django.contrib import admin
from django.urls import path,register_converter
from djangoTestApp import views as djangoTestApp_views
from .converters import Year4DigitConverter

register_converter(Year4DigitConverter,YYYY)
urlpatterns = [
    path(admin/, admin.site.urls),
    path(‘‘,djangoTestApp_views.welcomeTest),
    path(<str:name>/<int:age>/,djangoTestApp_views.userinfoTest),
    path(‘<YYYY:year>/‘,djangoTestApp_views.yearDisplay)
]

导入register_converter是把类转换成可转换类型并起个名字(YYYY)

3、在views.py中新增如下函数:

def yearDisplay(request,year):
    return HttpResponse(%04d is good year!%year)

这样就可以在网址中输入http://127.0.0.1:8000/2019可以得到如下结果:

技术分享图片

 

也可以使用正则表达式来匹配url,比如我们要匹配年份可以在urls.py写成如下:

 

from django.contrib import admin
from django.urls import path,register_converter,re_path
from djangoTestApp import views as djangoTestApp_views
from .converters import Year4DigitConverter

register_converter(Year4DigitConverter,YYYY)
urlpatterns = [
    path(admin/, admin.site.urls),
    path(‘‘,djangoTestApp_views.welcomeTest),
    #path(‘<str:name>/<int:age>/‘,djangoTestApp_views.userinfoTest),
    #path(‘<YYYY:year>/‘,djangoTestApp_views.yearDisplay)
    re_path(r‘^admin/(?P<year>[0-9]{1,4})/‘,djangoTestApp_views.yearDisplay),
]

然后在网址中输入http://127.0.0.1:8000/admin/2006就可以显示2006 is good year!

 

在path中也可以包含其他自定义的urls文件,在djangoTestApp下创建一个urls.py文件,写入如下代码:

from django.urls import path,include
from . import views as djangoTestApp_views

urlpatterns = [
    path(<int:year>/,djangoTestApp_views.yearDisplay),
]

修改djangoTestPro/urls.py文件如下:

from django.contrib import admin
from django.urls import path,register_converter,re_path,include
from djangoTestApp import views as djangoTestApp_views
from .converters import Year4DigitConverter

register_converter(Year4DigitConverter,YYYY)
urlpatterns = [
    path(admin/, admin.site.urls),
    path(‘‘,djangoTestApp_views.welcomeTest),
    #path(‘<str:name>/<int:age>/‘,djangoTestApp_views.userinfoTest),
    #path(‘<YYYY:year>/‘,djangoTestApp_views.yearDisplay)
    #re_path(r‘^admin/(?:page-(?P<year>\d+)/)‘,djangoTestApp_views.yearDisplay),
    path(admin/,include(djangoTestApp.urls)),
]

这时在网址中输入htt://127.0.0.1:8000/admin/2010得到如下结果:

技术分享图片

当然参数也可以写在djangoTestPro/urls.py里面,在urlpatterns增加一行代码如下所示:

path(admin/<str:name>/,include(djangoTestApp.urls)),

在djangoTestApp/urls.py里面增加一行代码如下:

path(<int:age>/ok/,djangoTestApp_views.userinfoTest),

这样在浏览器中输入网址http://127.0.0.1:8000/admin/watertaro/30/ok就可以看到如下:

技术分享图片

 

也可以在urls.py内include自定义的匹配url,在djangoTestPro/urls/py中增加如下代码:

urls = [
    path(blog/,djangoTestApp_views.blogDisplay),
    path(news/,djangoTestApp_views.newsDisplay),
]

urlpatterns = [
    path(admin/,include(urls)),
]

在views.py中增加如下代码:

def blogDisplay(request):
    return HttpResponse(This is blog.)

def newsDisplay(request):
    return HttpResponse(This is news.)

这时分别用http://127.0.0.1:8000/admin/blog和http://127.0.0.1:8000/admin/news访问分别返回对应的消息。

这样做的好处是,如果path前面都一样,那么就可以使用一条就可以了,其他的放到另外的url当中,然后使用include包含进来

 

注意到path中还可以传入固定参数,在djangoTestPro/urls.py中增加如下代码:

path(admin/param/<str:name>/,djangoTestApp_views.userinfoTest,{age:30}),

输入网址http://127.0.0.1:8000/admin/param/watertaro/得到的响应如下:

技术分享图片

相当于函数传入了俩个参数djangoTestApp_views.userinfoTest(request,name = ‘watertaro‘,age = 30)

这个参数也可以写到urls中的path中,效果是一样的

 

如果我们在python其他地方或者网页里面需要输入的网址,该怎么获取?

在path和re_path中有个可选参数name,类似于起个别名,对于在不同地方,django提供了不同的获取方式

url:在网页中获取当前地址,可以看下面的例子

修改djangoTestPro/urls.py中如下代码,分别增加name字段如下:

urls = [
    path(blog/,djangoTestApp_views.blogDisplay,name = blog),
    path(news/,djangoTestApp_views.newsDisplay,name = news),
]

urlpatterns = [
    path(admin/,include(urls),name = branch),
]

修改djangoTestApp/views.py中代码如下:

def blogDisplay(request):
    #return HttpResponse(‘This is blog.‘)
    return render(request,index.html)

在djangoTestApp目录下增加一个目录templates,并增加一个html格式的文件index,内容如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
</head>
<body>
{% url ‘blog‘ %}
</body>
</html>

这是输入http://127.0.0.1:8000/admin/blog可以看到内容如下:

技术分享图片

注意:如果是使用include引用其他地方的urls,name这里只能填写include里面urls的name,不能填写include所在path中的name

 

reverse:在python中可以使用reverse来获取地址,可以看下面的例子

修改djangoTestApp/views.py中代码如下:

from django.http import HttpResponse,HttpResponseRedirect
from django.urls import reverse

def newsDisplay(request):
    return HttpResponseRedirect(reverse(‘blog‘))

这时输入网址http://127.0.0.1:8000/admin/news得到的是blog的地址,如下所示

技术分享图片

 

下面再看另外一个例子

在djangoTestApp/urls.py的urlpatterns中增加一个path,如下

path(blog1/,djangoTestApp_views.blogDisplay,name = blog)

原来在djangoTestPro/urls.py的urls中也有个name=‘blog‘的path,此时我们使用http://127.0.0.1:8000/admin/blog登入显示的是/admin/blog/,如果要显示新增的这个怎么办?

django提供了命名空间(namespace)来解决这个问题

在djangoTestApp/urls.py中增加一行代码:

app_name = djangoTestApp

在djangoTestApp/templates/index.html中修改如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
</head>
<body>
{% url djangoTestApp:blog %}
</body>
</html>

这时在输入网址http://127.0.0.1:8000/admin/blog,显示结果为/admin/blog1/

也可以把djangoTestPro/urls.py中urls增加一个命名空间,修改如下:

urls = ([
    path(blog/,djangoTestApp_views.blogDisplay,name = blog),
    path(news/,djangoTestApp_views.newsDisplay,name = news),
],‘djangoTestPro‘)

把index.html中的djangoTestApp改成djangoTestPro再刷新网址就会显示/admin/blog/了

当然在path中使用include包含urls的时候就可以直接定义命名空间,如下:

path(admin/,include(djangoTestApp.urls,djangoTestApp1)),
path(admin/,include(urls,namespace=hello),name = branch),

 

python之Django学习笔记(三)---URL调度/URL路由

原文:https://www.cnblogs.com/watertaro/p/10572602.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!