Django之路由系统
Posted mjc69213
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django之路由系统相关的知识,希望对你有一定的参考价值。
URL配置(URLconf)就像Django所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表。
我们就是以这种方式告诉Django,遇到哪个URL的时候,要对应执行哪个函数。
一、URL组成部分详解
URL是Uniform Resource Locator的简写,统一资源定位符。
一个URL是由以下几部分组成的:
scheme://host:port/path/?query-string=xxx#anchor
scheme:代表访问的协议,一般为http或者https以及ftp
host:主机名,域名,比如:www.baidu.com。
port:端口号。浏览器默认使用80端口。
path:查找路径。比如www.jianshu.com/trending/now,后面的trending/now就是path
query-string:查询字符串。比如:www.baidu.com/s?wd=python,后面的wd=python就是查询字符串。
anchor:锚点,后台一般不用管,前端用来做页面的定位的。
注意:URL中所有的字符都是ASCII字符集,如果出现非ASCII字符集,比如中文,浏览器会先进行编码再进行传输。
二、URLconf配置
(一)基本格式
from django.conf.urls import url urlpatterns = [ url(正则表达式, views视图,参数,别名), ]
(二)参数说明
- 正则表达式:一个正则表达式字符串
- views视图:一个可调用对象,通常为一个视图函数
- 参数:可选的要传递给视图函数的默认参数(字典形式)
- 别名:一个可选的name参数
(三)注意事项
- urlpatterns中的元素按照书写顺序从上往下逐一匹配正则表达式,一旦匹配成功则不再继续。
- 若要从URL中捕获一个值,只需要在它周围放置一对圆括号(分组匹配)。
- 不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles 而不是 ^/articles。
- 每个正则表达式前面的‘r‘ 是可选的但是建议加上。
(四)一点补充
是否开启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 时就会提示找不到页面
三、分组
(一)无名分组
分组匹配 --> 相当于按照位置参数传递给视图函数
views.py
def add2(request, a, b): c = int(a) + int(b) return HttpResponse(str(c))
urls.py
url(r‘^add/(d+)/(d+)/$‘, calc_views.add2, name=‘add2‘),
(二)有名分组
分组命名匹配 --> 相当于按照关键字参数传递给视图函数
命名组可以使用命名的正则表达式组来捕获 URL 中的值并以关键字参数的方式传递给视图函数。
在 Python 正则表达式中,命名正则表达式组的语法是 (?P<name>pattern)
,其中 name 是组的名称,pattern 是要匹配的模式。
例子, urls.py
如下:
urlpatterns = [ ………… # 捕获一个 test/ 后面接上4个数字的 url # 并把这4个数字作为 test 视图函数的关键字参数 year url(r‘^test/(?P<year>[0-9]{4})/$‘, test), ]
视图函数,views.py
如下:
from django.http.response import HttpResponse # 上面 url 的最后四个数字作为关键字参数 year 被传入到视图函数 test 中 def test(request, year): return HttpResponse(‘年份:‘ + year)
打开:http://127.0.0.1:8000/test/2016/ ,就能看到 url 上的值 2016。
我们也可以有多个命名组,比如同时在 url 中传递年份和月份参数:
url(r‘^test/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$‘, test),
四、url反向解析
本质上就是给url匹配模式起别名,然后用过别名拿到具体的URL路径,避免挨个修改视图和模板中的url,改一个地方,全部都能改变
urls.py
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r‘^admin/‘, admin.site.urls), url(r‘^loginxxx/‘, views.login,name=‘login‘), url(r‘^indexxx/‘, views.index, name=‘index‘), ]
视图views.py
在视图中如何使用:
1、from django.urls import reverse
2、reverse("别名") --> 得到具体的URL路径
from django.shortcuts import render, HttpResponse, redirect from django.core.urlresolvers import reverse # 导入reverse包 def login(request): if request.method == ‘POST‘: if 1: return redirect(reverse(‘index‘)) # 解析成 indexxx/ return render(request, ‘login.html‘) def index(request): return HttpResponse(‘this is index‘)
模板 templates/login.html
在模板语言里面使用:
{% url "别名" %} --> 得到具体的URL路径
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="{% url ‘login‘ %}" method="post"> <!-- 解析成loginxxx/ --> {% csrf_token %} <input type="text" name="user" placeholder="username"> <input type="password" name="pwd" placeholder="password"> <input type="submit" value="提交"> </form> </body> </html>
五、路由分发
1、创建好Project后在全局配置文件中有一个urls.py这个模块,该模块主要管理本项目的全局url配置
2、每个APP也应该创建一个urls.py模块来管理自己APP下的url集(
(一)全局urls.py配置
需要注意的是:
1、需要import include模块
2、在urlpatterns中添加app下的urls模块, namespace 参数可以防止不同app下的 url name重名的问题。
项目下的urls.py
from django.conf.urls import url,include urlpatterns = [ url(r‘^app01/‘, include(‘app01.urls‘,namespace=‘app01‘)), url(r‘^app02/‘, include(‘app02.urls‘,namespace=‘app02‘)), ]
(二)APP下的urls.py
1、import django中url模块
2、import app中的views模块
3、需要注意的是url是以正则表达式来配置管理,访问web页面的url = 全局url+APP url
app01下的urls.py
from django.conf.urls import url from app01 import views urlpatterns = [ url(r‘^index/‘, views.index, name=‘index‘),
app02.urls.py
from django.conf.urls import url from app02 import views urlpatterns = [ url(r‘^index/‘, views.index, name=‘index‘), ]
app01.views.py
from django.shortcuts import HttpResponse from django.core.urlresolvers import reverse def index(request): return HttpResponse(reverse(‘app01:index‘))
app02.views.py
from django.shortcuts import HttpResponse from django.core.urlresolvers import reverse def index(request): return HttpResponse(reverse(‘app02:index‘))
以上是关于Django之路由系统的主要内容,如果未能解决你的问题,请参考以下文章