urls.py的配置[路由配置]

Get请求与Post请求的方式

get请求:
(1)地址栏输入url
(2)<a href="请求url">点击</a>
(3)<form action="请求url" method="get"></form> post请求:
<form action="请求url" method="post"></form>

Django 如何处理一个请求

当一个用户请求Django 站点的一个页面,下面是Django 系统决定执行哪个Python 代码遵循的算法:

1.Django 决定要使用的根URLconf 模块。通常,这个值就是ROOT_URLCONF 的设置,但是如果进来的HttpRequest 对象具有一个urlconf 属性(通过中间件request processing 设置),则使用这个值来替换ROOT_URLCONF 设置。

2.Django 加载该Python 模块并寻找可用的urlpatterns。它是django.conf.urls.url() 实例的一个Python 列表。

3.Django 依次匹配每个URL 模式,在与请求的URL 匹配的第一个模式停下来。

4.一旦其中的一个正则表达式匹配上,Django 将导入并调用给出的视图,它是一个简单的Python 函数(或者一个基于类的视图)。

如果匹配的正则表达式返回了没有命名的组,那么正则表达式匹配的内容将作为位置参数提供给视图。
关键字参数由正则表达式匹配的命名组组成,但是可以被django.conf.urls.url()的可选参数kwargs覆盖。
如果没有匹配到正则表达式,或者如果过程中抛出一个异常,Django 将调用一个适当的错误处理视图。(通常就给用户返回一个404)

urls.py的内容是对 views 对应关系[路由系统]

URL路由注意事项:

  • 若要从URL 中捕获一个值,只需要在它周围放置一对圆括号。
  • 不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles 而不是 ^/articles。
  • 每个正则表达式前面的'r' 是可选的但是建议加上。它告诉Python 这个字符串是“原始的” —— 字符串中任何字符都不应该转义。

将所有的Url请求放在主配置中;

1.不利于业务解耦:

from django.conf.urls import url
from django.contrib import admin
from cmdb import views # 将处理请求放在app的views中 urlpatterns = [
# url(r'^admin/', admin.site.urls),
url(r'^index/', views.index), # 一条路由映射,指向views 中的 index 函数
]

根据业务模块将不同将Url请求放到相应的应用中;

1.根据业务模块将不同的url请求放到不同的业务app中:

# 需要导入模块 include
from django.conf.urls import url,include
from django.contrib import admin urlpatterns = [
url(r'^admin/', admin.site.urls),
# 将包含 blog/开头的请求 抛给 blog 应用 下的urls.py文件中去
url(r'^blog/', include('blog.urls')),
]

2.配置blog应用下的urls.py文件:

from django.conf.urls import url

# 将属于blog 视图函数views 导入到当前
from blog import views as blog_views urlpatterns = [
# 请求来的url: http://127.0.0.1:8000/blog/article/ 转给article 视图函数;
url(r'^article/$', blog_views.article),
]

从URL里获取值以及正则匹配

注:

若要从URL 中捕获一个值,只需要在它周围放置一对圆括号。
不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles 而不是 ^/articles。
每个正则表达式前面的'r' 是可选的但是建议加上。它告诉Python 这个字符串是“原始的” —— 字符串中任何字符都不应该转义。

例子简单的 URLconf(没有命名的正则表达式组):

1.没有命名的正则表达式组中,获取的值需要按照 位置 参数传递给视图,不利于扩展

from django.conf.urls import url
from blog import views as blog_views urlpatterns = [
# 指定默认首页http://127.0.0.1:8000 跳转到 index 页面
url(r'^$', views.index), # 将请求为 /blog/articles/2003/ 转给 special_case_2003 函数
url(r'^articles/2003/$', views.special_case_2003), # 将请求为 /blog/articles/(4位数字)/ 转给 year_archive 函数
url(r'^articles/([0-9]{4})/$', views.year_archive), # 将请求为 /blog/articles/(4位数字)/(2位数字)/ 转给 month_archive 函数
url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive), # 将请求为 /blog/articles/(4位数字)/(2位数字)/(所有数字的)/ 转给 article_detail 函数
url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]

2.在views.py中获取

from django.shortcuts import render,HttpResponse
def article_year(request, year):
# 按顺序接收 无名分组数据, 形参值随意 year
return HttpResponse(str(year))

请求注释:

/blog/articles/2005/03/      请求将匹配列表中的第三个模式。Django 将调用函数views.month_archive(request, '2005', '03')。
/blog/articles/2005/3/ 不匹配任何URL 模式,因为列表中的第三个模式要求月份应该是两个数字。
/blog/articles/2003/ 将匹配列表中的第一个模式不是第二个,因为模式按顺序匹配,第一个会首先测试是否匹配。请像这样自由插入一些特殊的情况来探测匹配的次序。
/blog/articles/2003 不匹配任何一个模式,因为每个模式要求URL 以一个斜线结尾。
/blog/articles/2003/03/03/ 将匹配最后一个模式。Django 将调用函数views.article_detail(request, '2003', '03', '03')。

例子URLconf(命名组的重写):

注:

  • 在Python 正则表达式中,命名正则表达式组的语法是(?Ppattern),其中name 是组的名称,pattern 是要匹配的模式。
  • 命名组方式可以使用命名的正则表达式组来捕获URL 中的值并以关键字 参数传递给视图。
  • 这意味 URLconf 会更加明晰且不容易产生参数顺序问题的错误 —— 可以在视图函数定义中重新安排参数的顺序。当然,这些好处是以简洁为代价;

1.在Urls.py中(?P<year_id>[0-9]{4})year_id即为名称

from django.conf.urls import url
from blog import views as blog_views urlpatterns = [
url(r'^articles/2003/$', views.special_case_2003),
url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
url(r'^articles/(?P<year_id>[0-9]{4})/(?P<month_id>[0-9]{2})/$', views.month_archive),
url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),
]

2.在views.py中获取

from django.shortcuts import render,HttpResponse
def article_year(request,month_id,year_id):
# 根据关键字参数 获取的值,无需按照顺序接收(但是根据实际的命名组 填写关键字参数)
return HttpResponse(str(year_id),str(month_id))

请求注释:

/blog/articles/2005/03/       请求将调用views.month_archive(request, year='2005', month='03')函数。
/blog/articles/2003/03/03/ 请求将调用函数views.article_detail(request, year='2003', month='03', day='03')。

URL的反向解析

当修改了URL 地址后,在模板中引用的 提交 URL 同样需要修改;对这些地址就是硬编码(费力、不可扩展且容易产生错误)的行为;

对此Django 提供了一个解决方案使得URL 映射是URL 设计唯一的储存库。在URLconf填充它,然后可以双向使用它:

  • 根据用户/浏览器发起的URL 请求,它调用正确的Django 视图,并从URL 中提取它的参数需要的值。
  • 根据Django 视图的标识和将要传递给它的参数的值,获取与之关联的URL。

1.在Urls.py中配置name="LOGIN":

from django.conf.urls import url,include
from django.contrib import admin
from app01 import views as app01_views urlpatterns = [
url(r'^admin/', admin.site.urls), # 用户请求url http://127.0.0.1/login.html; 即使在这里将 ^login.html/ 改为 ^loginssss.html/ 对模板处的引用也不会有问题
# 使用别名的方式 解耦 url 的变更请求;name = "LOGIN" 在模板中 引用使用 {% url 'LOGIN' %} 代替这个路径
url(r'^login.html/', app01_views.login, name="LOGIN") # 当url内部需要传值时,在templates内引用时 同样需要接收 该传值;
url(r'^edit/(\d+)', app01_views.edit_book,name="EDIT"),
]

2.在views.py中通过render将请求来的地址渲染给模板的login.html{% url 'LOGIN' %}地址:

from django.shortcuts import render, HttpResponse,redirect

# redirect解耦内部url地址 需要模块 reverse
from django.urls import reverse def login(request):
if request.method == "POST":
user = request.POST.get("user")
pwd = request.POST.get("pwd")
return HttpResponse("登录成功!") # render(request, "login.html") 表示返回 templates/ 实际的 页面名称
return render(request, "login.html") # 如果要重定向到 一个内部url地址可以使用 redirect 需要导入模块 reverse
# return redirect(reverse('LOGIN')) def edit_book(request,id):
if request.method=="POST":
titles=request.POST.get("title")
pubdate=request.POST.get("pubdate")
price=request.POST.get("price")
publish=request.POST.get("publish") models.Book.objects.filter(id=id).update(title=titles,pubDate=pubdate,price=price,publish=publish)
return redirect(reverse('INDEX')) Book_obj=models.Book.objects.filter(id=id)[0]
return render(request,"edit.html",{"Book_obj":Book_obj})

3.在templates模板语言中的action="{% url 'LOGIN' %}" 获取render渲染来的urls.py实际请求地址:

<body>
{# 通过render渲染时 将urls.py定义的别名 name="LOGIN" 转换为实际的 请求路径地址 loginssss.html #}
{# 格式 action="{% url '别名' %}";url为关键字 '别名' 为在视图函数中定义的name值 #}
<form action="{% url 'LOGIN' %}" method="post"> <p>姓名 <input type="text" name="user"></p>
<p>密码 <input type="password" name="pwd"></p>
<input type="submit">
</form>
</body>

4.在templates模板语言中需要接收渲染需要传值时

{# 当 硬解码 需要传值时,需要 在{% url 'EDIT' 指定ID值 %} #}
<form action="{% url 'EDIT' Book_obj.id %}" method="post">
{# csrf安全机制的设置 否则 存在 403 情况 #}
{% csrf_token %}
<p>书名:<input type="text" name="title" value="{{ Book_obj.title }}"></p>
<p>出版日期:<input type="date" name="pubdate" value="{{ Book_obj.pubDate|date:'Y-m-d' }}"></p>
<p>价格:<input type="text" name="price" value="{{ Book_obj.price }}"></p>
<p>出版社:<input type="text" name="publish" value="{{ Book_obj.publish }}"></p>
<input type="submit">
</form>

urls.py的配置[路由配置]的更多相关文章

  1. hi-nginx-java的无配置路由配置

    hi-nginx-java既可以通过实现hi.servlet抽象来像Flask那样快速配置路由,例如: 1 hi.route r = hi.route.get_instance(); 2 r.get( ...

  2. Rest_framework 和路由配置(一)

    简介 Django REST framework是一个建立在Django基础之上的Web 应用开发框架,可以快速的开发REST API接口应用. Rest_framework 核心思想: 缩减代码. ...

  3. 第三百零四节,Django框架,urls.py模块,views.py模块,路由映射与路由分发以及逻辑处理——url控制器

    Django框架,urls.py模块,views.py模块,路由映射与路由分发以及逻辑处理——url控制器 这一节主讲url控制器 一.urls.py模块 这个模块是配置路由映射的模块,当用户访问一个 ...

  4. 二 Django框架,urls.py模块,views.py模块,路由映射与路由分发以及逻辑处理——url控制器

    Django框架,urls.py模块,views.py模块,路由映射与路由分发以及逻辑处理——url控制器 这一节主讲url控制器 一.urls.py模块 这个模块是配置路由映射的模块,当用户访问一个 ...

  5. Django(一):url路由配置和模板渲染

    urls.py路由用法 url基本概念 url格式 urls.py的作用 url解析过程 include的作用 kwarg的作用 name的作用 URL概念 URL(Uniform Resoure L ...

  6. Django路由配置之子路由include(URL分发)

    子路由include(URL分发) 在一个项目中可能存在多个应用,为了方便区分和管理,在项目的总路由urls.py中会进行路由分发: (1)项目总路由导入from  django.conf.urls  ...

  7. 如何用vue-router为每个路由配置各自的title

    传统方法 以前在单页面路由中,就只能在html文件中定一个固定的网站的title.如果想要动态的去修改,需要使用如下的方法. document.title = '这是一个标题'; 这样会让我们做很多无 ...

  8. Linux上临时路由、永久路由配置

    Linux下查看路由条目 查看路由表命令 route -n 示例 [root@cobbler_vm ~]# route -n Kernel IP routing table Destination G ...

  9. Django之urls.py路由配置(URLConf)

    urls.py路由配置(URLConf) URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表. 基本格式: Django1.x版本 ...

随机推荐

  1. NDT 算法和一些常见配准算法

    原文链接:http://ghx0x0.github.io/2014/12/30/NDT-match/ 目前三维配准中用的较多的是ICP迭代算法,需要提供一个较好的初值,同时由于算法本身缺陷,最终迭代结 ...

  2. Bagging, Boosting, Bootstrap

    Bagging 和 Boosting 都属于机器学习中的元算法(meta-algorithms).所谓元算法,简单来讲,就是将几个较弱的机器学习算法综合起来,构成一个更强的机器学习模型.这种「三个臭皮 ...

  3. SpringCloud Zuul(路由网关)

    ⒈Zuul是什么? Zuul包含了两个最主要的功能,对请求的路由和过滤.其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础.过滤器功能则负责对请求的处理过程进行干预,是实 ...

  4. Shell-求平均

    Compute the Average Given integers, compute their average correct to three decimal places. Input For ...

  5. MySQL主从1205报错【转】

    主从报错1205 Slave SQL thread retried transaction 10 time(s) in vain, giving up. Consider raising the va ...

  6. 027_nginx常见优化参数

    一.nginx.conf主配置文件 proxy_ignore_client_abort on; #不允许代理端主动关闭连接

  7. 使用nvidia-smi命令查看显卡信息

    安装: 1.先安装tensorflow-gpu,需要查看对应的版本,通过pycharm运行程序时会报错,提示需要安装CUDA,且会指明需要版本号 >> pip install tensor ...

  8. php OpenSSL 加解密

    2018-1-6 17:10:19 星期六 $data = '123456'; $openssl_method = 'AES-256-CBC'; $openssl_iv_length = openss ...

  9. Golang 优化之路——bitset

    写在前面 开发过程中会经常处理集合这种数据结构,简单点的处理方法都是使用内置的map实现.但是如果要应对大量数据,例如,存放大量电话号码,使用map占用内存大的问题就会凸显出来.内存占用高又会带来一些 ...

  10. Uva 11178 Morley定理

    题意: 给你三角形三个点, 定理是 三个内角的三等分线相交得出 DEF三点, 三角新 DFE是等边三角形 然后要你输出 D E F 的坐标 思路 : 求出三个内角,对于D 相当于 BC向量逆时针旋转, ...