码迷,mamicode.com
首页 > 其他好文 > 详细

Django之路由系统

时间:2018-09-24 00:33:18      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:width   django   函数   ascii   request   修改   自动   query   res   

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参数

(三)注意事项

  1. urlpatterns中的元素按照书写顺序从上往下逐一匹配正则表达式,一旦匹配成功则不再继续。
  2. 若要从URL中捕获一个值,只需要在它周围放置一对圆括号(分组匹配)。
  3. 不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles 而不是 ^/articles。
  4. 每个正则表达式前面的‘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之路由系统

标签:width   django   函数   ascii   request   修改   自动   query   res   

原文地址:https://www.cnblogs.com/mjc69213/p/9693771.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!