运维开发笔记整理-URL配置

                                       作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.URL路由

  对于高质量的Web应用来说,使用简洁,优雅的URL的路由是一个非常值得重视的细节。Django让你随心所欲的设计你的URL,不受框架约束。

  为了给一个用用设计URL,你需要创建一个Python模块,通常称为URLconf(URL configuration)。这个模块是纯粹的Python代码,包含URL模式(简单的正则表达式)到Python函数(你的视图)的简单映射。

二.Django如何处理一个请求

1>.Django加载ROOT_URLCONF指定的模块,并寻找可用的urlpatterns,它是djngo.conf.urls.url()实力的一个Python列表;

2>.Django依次匹配每个URL,在与请求的URL匹配的第一个url停下来;

3>.一旦其中的一个正则表达式匹配上,Django将导入并调用给出的视图,它是一个简单的python函数(或者一个基于类的视图)。视图捕获如下参数:

  参数一:一个HttpRequest实例。

  参数二:如果匹配的正则表达式返回了没有命名的组,那么正则表达式匹配的内容将作为位置参数提供给视图。

  参数三:关键字参数由正则表达式匹配的命名组组成,但是可以被django.conf.urls.url()的可选参数kwargs覆盖。

4>.如果没有匹配到正则表达式,或者如果过程这种抛出一个异常,django将调用一个适当的错误处理视图:handler404.handler500,handler403,handler400。

三.URLconf

  URLconf是一个python模块,一个是URL模式(简单正则表达式)到python函数(视图)之间的映射。

四.urlpatterns

  urlpatterns是一个url()实力类型的Python列表

  urlpatterns中的每个正则表达式在第一次访问它们时被编译

五.url函数

def url(regex, view, kwargs=None, name=None):
if isinstance(view, (list, tuple)):
# For include(...) processing.
urlconf_module, app_name, namespace = view
return RegexURLResolver(regex, urlconf_module, kwargs, app_name=app_name, namespace=namespace)
elif callable(view):
return RegexURLPattern(regex, view, kwargs, name)
else:
raise TypeError('view must be a callable or a list/tuple in the case of include().')

def url(regex, view, kwargs=None, name=None):

  regex:一个字符串(原始字符串)或简单的正则表达式。

  view:view参数是一个视图函数或as_view()的结果(基于类的视图)。

  kwargs:传递额外的参数给视图。

  name:url名称。

六.include 示例

  案例一:

urlpatterns = [
url( r'^$', RedirectView.as_view(url="/dashboard/")),
url(r'^dashboard/', include("dashboard.urls")),
url(r'^accounts/', include("accounts.urls")),
url(r'^admin/', admin.site.urls),
]

  案例二:

urlpatterns = [
url(r"^user/", include([
url(r'^list/$', view.userlist, name="user_list"),
url(r'^info/$', view.userinfo, name="userer_inf),
url(r'^modify/', include([
  url(r'status/$',view.modifystatus, name="user_modify_status"),
   ]))
]))
]

七.位置参数

  若要从URL中捕获一个值,只需要在它周围放置一对圆括号。

项目根目录的url.py的配置

from django.conf.urls import url,include
from django.contrib import admin urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r"^dashboard/",include("dashboard.urls")),
]

dashboard的APP中urls.py的配置

#!/usr/bin/env python
#_*_conding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ from django.conf.urls import url
from . import views urlpatterns = [
url(r'^articles/([0-9]{4})/$', views.year_archive),
url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]

  dashboard的APP中views.py的配置

#!/usr/bin/env python
#_*_conding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ from django.http import HttpResponsedef year_archive(request,*args,**kwargs):
print("位置参数:",args)
print("关键字参数:",kwargs)
return HttpResponse(args) def month_archive(request,*args,**kwargs):
print("位置参数:", args)
print("关键字参数:", kwargs)
return HttpResponse(args) def article_detail(request,*args,**kwargs):
print("位置参数:", args)
print("关键字参数:", kwargs)
return HttpResponse(args)

  webUI访问效果如下:

八.关键字参数

语法:

(?p<name>pattern)

  name是传给视图参数的名字。

  pattern是一个正则表达式,也是关键字参数的值。案例代码如下,我们将上面的位置参数的代码不要做修改,只需要改动dashboard的配置:

#!/usr/bin/env python
#_*_conding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ from django.conf.urls import url
from . import views urlpatterns = [
url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[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),
]

  访问webUI在后端可以看到传递的具体参数,如下图所示:

九.额外参数

  URLconfs具有一个钩子,让你传递一个python字典作为额外的参数传递给视图函数。

  django.conf.urls.url()函数可以接受一个可选的第三个参数,它是一个字典,表示想要传递给视图函数的额外关键字参数。

#!/usr/bin/env python
#_*_conding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ from django.conf.urls import url
from . import views urlpatterns = [
url(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive, {'Name': '尹正杰'}),
]

  上面的代码是dashboard的APP中的urls.py配置,下面的代码是dashboard的APP中的views.py的配置:

#!/usr/bin/env python
#_*_conding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ from django.http import HttpResponsedef year_archive(request,*args,**kwargs):
print("位置参数:",args)
print("关键字参数:",kwargs)
return HttpResponse(args)

  访问webUI效果如下:

十.URL反向解析

  django给每个URL取了一个名字,存储每个URL和name的映射关系。

  根据Django视图的标识和将要传递给他的参数的值,获取与之关联的URL。这种方式叫做反向解析URL,反响URL匹配,反响URL查询或者简单的URL反查。

#!/usr/bin/env python
#_*_conding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ from django.conf.urls import url
from . import views urlpatterns = [
url(r"^$",views.index),
url(r"^login/",views.user_login),
url(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'),
]

  上面代码是dashboard的APP中的urls.py文件,下面的代码是bashboard的APP中的views.py,具体内容如下:

#!/usr/bin/env python
#_*_conding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ from django.http import HttpResponseRedirectfrom django.core.urlresolvers import reverse
def year_archive(request,*args,**kwargs):
print("===",args)
print(kwargs)
print('news-year-archive')
year = 2006
print(args)
return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))

  如果你使用django的模板代码的话,需要进行如下调用:

<a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a>

   想要了解Django2.0以上版本的url编写规则吗?详情请参考我之前的笔记:《玩转Django2.0》读书笔记-编写URL规则

运维开发笔记整理-URL配置的更多相关文章

  1. 运维开发笔记整理-django日志配置

    运维开发笔记整理-django日志配置 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Django日志 Django使用python内建的logging模块打印日志,Pytho ...

  2. 运维开发笔记整理-使用Django编写helloworld

    运维开发笔记整理-使用Django编写helloworld 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   一.创建Django项目 1>.创建Django项目 djang ...

  3. 运维开发笔记整理-基于类的视图(CBV)

    运维开发笔记整理-基于类的视图(CBV) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.FBV与CBV 1>.什么是FBV FBC(function base views ...

  4. 运维开发笔记整理-template的使用

    运维开发笔记整理-Django的template的使用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在上一篇博客中我们学习了HttpResponse 和JsonResponse方 ...

  5. 运维开发笔记整理-Request对象与Response对象

    运维开发笔记整理-Request对象与HttpResponse对象 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.request对象 1>.什么是request 首先,我 ...

  6. 运维开发笔记整理-Django模型语法

    运维开发笔记整理-Django模型语法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.模型基本概念 1>.什么是模型 模型是你的数据唯一的,权威的信息源.它包含你所存储数 ...

  7. 运维开发笔记整理-创建django用户

    运维开发笔记整理-创建django用户 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.创建普通用户 C:\Users\yinzhengjie\softwares\Pycharm ...

  8. 运维开发笔记整理-QueryDict对象

    运维开发笔记整理-QueryDict对象 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 客户端发送数据请求有很多种,相信运维人员已经很清楚了,如果不太清楚的话可以参考我之前的学习笔 ...

  9. 运维开发笔记整理-JsonResponse对象

    运维开发笔记整理-JsonResponse对象 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.使用HttpResponse发送json格式的数据 1>.HttpRespo ...

随机推荐

  1. 安防视频互联网化的EasyDSS流媒体服务器不但能Easy安防流媒体的开发而且能更加互联网化视频协议的输出

    开发EasyDSS的初衷 自从12年开始做EasyDarwin的时候,当时眼光一直都仅仅局限在安防监控视频这一块,对RTMP没有太大的重视,对于后起之秀HLS更是没有太多关注,然而经历了15直播火热的 ...

  2. 取消Windows server 关机提示备注的方法

    打开“开始”-“运行”,在“打开”一栏中输入“gpedit.msc”命令打开组策略编辑器,依次展开“计算机配置”→“管理模板”→“系统”,双击右侧窗口出现的“显示‘关闭事件跟踪程序’”,将“未配置”改 ...

  3. 使用EF 4.1的DbContext的方法大全

    简述:EF4.1包括Code First和DbContext API.DbContext API为EF提供更多的工作方式:Code First,Database First和Model First. ...

  4. MySQL二进制快速安装升级(待验证)

    适合小版本的升级. 即 关闭当前的MySQL,替换当前的二进制文件或包,在现有的数据目录上重启MySQL,并运行mysql_upgrade. 特点:不改变数据文件,升级速度快:但,不可以跨操作系统,不 ...

  5. Java内存分析工具

    内存分析工具 IDEA插件(VisualVM Launcher) 执行main函数的时候,同时启动jvisualvm,实时查看资源消耗情况.如图效果: Eclipse Memory Analyzer ...

  6. 【转帖】你知道X86构架,你知道SH构架吗?

    你知道X86构架,你知道SH构架吗? https://www.eefocus.com/mcu-dsp/363100   前面我们讲到了 8 位处理器,32 位处理器,以及 X86 构架,那么除了这些还 ...

  7. Windows 10部署教程

    1. 获取主板密钥 在powershell中执行: (Get-WmiObject -query 'select * from softwareLicensingService').OA3xOrigin ...

  8. lmir 随笔

    近期需要研究一些特征工程的工作,就打算把微软之前公布出来的特征都复现一遍,今天遇到的特征是 LMIR, 其实也就是language model for information retrieval的简写 ...

  9. linux 系统扩容 VMware Centos---VMware ESXi

    用到的命令 df  fdisk  pvcreate   pvdisplay    vgdisplay    vgextend    lvdisplay    lvextend  resize2fs 0 ...

  10. go 基本IO接口

    package main import ( "fmt" "io" "strings" ) func ReadFrom(reader io.R ...