python之Django学习笔记(三)---URL调度/URL路由
在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路由的更多相关文章
- python网络编程学习笔记(三):socket网络服务器(转载)
1.TCP连接的建立方法 客户端在建立一个TCP连接时一般需要两步,而服务器的这个过程需要四步,具体见下面的比较. 步骤 TCP客户端 TCP服务器 第一步 建立socket对象 建立socket对 ...
- python之Django学习笔记(二)---Django从工程创建、app创建到表建模在页面的显示
创建工程: 在命令行中切换目录至需要创建工程的目录,然后在命令行中输入如下命令创建djangoTestPro工程 D:\PycharmProjects\untitled\MyTestProject&g ...
- Django学习笔记(二)URL编写规则
先在根目录以及每个app内添加一个空白的urls.py(此处根目录指项目同名文件夹内).程序收到用户请求时,先在根目录的urls.py查找该URL属于哪个app,再从app的urls.py找到具体的U ...
- python之Django学习笔记(一)---搭建Django开发环境和一些基本命令
1.Django下载 官方下载地址:https://www.djangoproject.com/download/ 2.Django安装 linux/windows安装方法相同,具体有以下俩种 pip ...
- Django 学习笔记1-- URLconf
今天好像巴黎有点乱,希望明天太阳还会照常升起. 简介 Django 是一个由 Python 编写.开源并采用经典的 MVC 设计模式的 Web Full Stack 应用框架. 在 Django 中, ...
- Django学习笔记(三)—— 型号 model
疯狂暑期学习 Django学习笔记(三)-- 型号 model 參考:<The Django Book> 第5章 1.setting.py 配置 DATABASES = { 'defaul ...
- Python框架之Django学习笔记(十七)
Django框架之表单(续二) 今天的这篇博客将是Django学习笔记博客的最后一篇,基本每周最少一篇的Django框架学习,坚持到今天也实属不易,当然了,这个框架的学习仅仅是Django框架的基础部 ...
- Django 学习笔记(三)模板导入
本章内容是将一个html网页放进模板中,并运行服务器将其展现出来. 平台:windows平台下Liunx子系统 目前的目录: hello ├── manage.py ├── hello │ ├── _ ...
- Django学习笔记(9)—— 开发用户注册与登录系统
一,项目题目: 开发用户注册与登录系统 该项目主要练习使用Django开发一个用户注册与登录的系统,通过这个项目然后巩固自己这段时间所学习的Django知识. 二,项目需求: 开发一个简单的用户登录与 ...
随机推荐
- java集合遍历的几种方式总结及比较
集合类的通用遍历方式, 用迭代器迭代: Iterator it = list.iterator(); while(it.hasNext()) { Object obj = it.next(); } ...
- 公众号用户发送消息后台PHP回复没有反应的解决办法
1.问题:微信公众平台官方提供下载的示例代码中,使用$postStr =$GLOBALS["HTTP_RAW_POST_DATA"];来获取微信服务器推送的消息数据.但是有的开发者 ...
- GLSL ES 中的存储变量修饰符(const/attribute/uniform/varying/in/centroid in/out/centroid out)
GLSL ES 3.00 中支持的存储变量修饰符 变量名称 作用 示例 const 编译过程常量,或者函数的只读参数 const vec3 zAxis = vec3 (0.0, 0.0, 1.0); ...
- 关于spring aop Advisor排序问题
关于spring aop Advisor排序问题 当我们使用多个Advisor的时候有时候需要排序,这时候可以用注解org.springframework.core.annotation.Order或 ...
- 安装pwntools
使用手册 http://pwntools.readthedocs.io/en/stable/ 环境 全新的ubuntu 14.04 64位 py2.7 实测ubuntu 18.04 64位同样适用 过 ...
- 2019 蓝桥杯省赛 A 组模拟赛(一)-修建公路
题目: 蒜头国有 nn 座城市,编号分别为 0,1,2,3,...,n-1.编号为 x 和 y 的两座城市之间如果要修高速公路,必须花费 x|y 个金币,其中|表示二进制按位或. 吝啬的国王想要花最少 ...
- php 设计模式(转)
PhpDesignPatterns [PHP 中的设计模式] 一. Introduction[介绍] 设计模式:提供了一种广泛的可重用的方式来解决我们日常编程中常常遇见的问题.设计模式并不一定就是一个 ...
- [Ubuntu]pkg-config和ldconfig
转载自->这里 我们知道,linux编译源码包基本步骤无非是:configure,make,make install三部曲:configure过程中可能会遇到无法找到某些头文件和动态库:原因有两 ...
- BZOJ1757 : Apple 偷苹果
设$f0[i][j][x][y][S]$表示盗贼位于$(i,j)$,守卫位于$(x,y)$,每棵苹果树苹果数量为$S$,盗贼先手时盗贼还能偷多少苹果. 设$f1[i][j][x][y][S]$表示盗贼 ...
- 离校登记网页项目个人总结(Alpha阶段)
个人小结 在Alpha阶段,我和我的小团队六人,经过六天的努力完成了我们最初需求分析里的基本功能,在这里为我们团队的成功表示祝贺.在这个过程中,对于自己的表现觉得既有做的好的方面,也有很多不足需要改进 ...