我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python自动化运维:Django之U

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python自动化运维:Django之U

准备
首先新建一个Django 项目

django-admin startproject urlTest

进入manage.py所在目录后

./manage.py startapp app1
./manage.py startpap app2

此时我们新建了一个名为urlTest的项目,其中有两个模块的名称分别为app1和app2。(树目录结构如下)

.
├── app1
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── app2
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── db.sqlite3
├── manage.py
└── urlTest
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py


在settings.py中我们可以看到:
ROOT_URLCONF = 'urlTest.urls'
#浏览器访问的所有的url都将在urlTest目录下的urls.py中配置,
urls.py默认加入了admin模块的url:

# urlTest.urls.py 
from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
]

也即是说,每个url都映射到了一个指定的view函数,其中views中定义的函数接受一个request,并返回一个response。
如对view的工作原理不清楚,可参考这里request-response。

这里写代码片
正则表达式与命名组

首先在app1模块中通过正则表达式分别动态的匹配年,年月,年月日类型的URL。
默认的情况下app1模块中是没有urls.py文件,在我们新建了之后,还需要在urlTest的urls.py加上:

url(r'^app1/', include('app1.urls'))
#这样就包括了app1模块的urls.py文件
接下来在新建的app1模块下的urls.py中写动态正则表达式:

#  app1.urls.py
from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$', views.index),
    url(r'^([0-9]{4})/$', views.pattern1),
    url(r'^([0-9]{4})/(0?[1-9]|1[0-2])/$', views.pattern2),
    url(r'^([0-9]{4})/(0?[1-9]|1[0-2])/(0?[1-9]|[1-2][0-9]|3[0-1])/$', views.pattern3),
    #记得加上^和$否则年月,年月日的匹配都会被年的匹配
]

我用斜杆“/”作为分割年月日的符号,但是为什么斜杆之前要加上圆括号呢?因为当加上圆括号的时候,django就能从URL中捕获这一个值并传递给相对应的views函数,当然使用的是位置传参。
根据URL匹配到指定的views函数后,我分别返回了HttpResponse:

#  app1.views
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.

def index(request):
    return HttpResponse('index', 'text/plain')


def pattern1(request, year):
    return HttpResponse(year, 'text/plain')


def pattern2(request, year, month):
    return HttpResponse(year + month, 'text/plain')


def pattern3(request, year, month, date):
    return HttpResponse(year + month + date, 'text/plain')

刚才我们在使用圆括号进行传参的时候是位置传参,那么如果我们希望使用关键字传参的时候该怎么办呢?
这时候我们就使用到了命名组,命名组的正则表达式语法是(?P<name>pattern),其中name是指传递参数的名字,pattern是指匹配模式。
因此,下面的代码与之前的正则表达式+圆括号是完全等效地:

#  app1.urls.py
from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$', views.index),
    url(r'^(?P<year>[0-9]{4})/$', views.pattern1),
    url(r'^(?P<year>[0-9]{4})/(?P<month>0?[1-9]|1[0-2])/$', views.pattern2),
    url(r'^(?P<year>[0-9]{4})/(?P<month>0?[1-9]|1[0-2])/(?P<date>0?[1-9]|[1-2][0-9]|3[0-1])/$', views.pattern3),
]

最后值得注意的是在views函数中的参数是可以使用默认参数的,以及可以使用正则表达式进行不捕获参数的设置(可在嵌套参数中使用),如语法(?:….)。
除了捕获URL参数以外,我们还可以直接通过url函数传输额外的数据给view函数。

# urls.py
# 替换index的url
url(r'^$', views.index, {'string': 'Hello World!'})

# views.py
def index(request, string):
    return HttpResponse(string, 'text/plain')

如果在包含include函数的url函数里面传输额外的数据,那么额外的数据将传输给被包含的urls.py的每一行url函数上。
URL模式与命名空间

在url patterns上里面的每一个url函数就是一个URL模式,在django中使用类django.core.urlresolvers.RegexURLPattern来表示。

而url patterns就代表着一个URL分解器(url resolver),使用include函数包含其他的url配置模块也是作为一个URL分解器来解析,在django中使用类django.core.urlresolvers.RegexURLResolver来表示。

命名空间主要分为两种,分别是实例命名空间(instance namespace)以及应用命名空间(application namespace)。

为什么需要命名空间呢?
在之前如果我们通过URL反查的话是通过URL模式中的name属性来进行反查标记的,但是name属性容易重复并且不利于复用,当我们要多次部署一个URL配置模块的时候,就无法通过简单的name属性来进行标记了。

如何设置实例命名空间以及应用命名空间?

# include函数的API
include(arg, namespace=None, app_name=None)
# namespace设置实例命名空间,app_name设置应用命名空间
# 不能只设置app_name,否则会报错,以下是报错的源码
if app_name and not namespace:
    raise ValueError('Must specify a namespace if specifying app_name.')

一般来说,同一应用下的不同实例应该具有相同的应用命名空间,但是,这并不意味着不同应用可以使用相同的实例命名空间,因为实例命名空间在你所有项目中都是唯一的。
URL反向解析


URL反向解析一般是通过reverse函数以及模板中的url标记实现。
我们首先看看在django官方文档中URL反向解析的机制:

    Reversing namespaced URLs
    When given a namespaced URL (e.g. ‘polls:index’) to resolve, Django splits the fully qualified name into parts and then tries the following lookup:

        First, Django looks for a matching application namespace (in this example, ‘polls’). This will yield a list of instances of that application.

        If there is a current application defined, Django finds and returns the URL resolver for that instance. The current application can be specified with the current_app argument to the reverse() function.

        The url template tag uses the namespace of the currently resolved view as the current application in a RequestContext. You can override this default by setting the current application on the request.current_app attribute.

        If there is no current application. Django looks for a default application instance. The default application instance is the instance that has an instance namespace matching the application namespace (in this example, an instance of polls called ‘polls’).

        If there is no default application instance, Django will pick the last deployed instance of the application, whatever its instance name may be.

        If the provided namespace doesn’t match an application namespace in step 1, Django will attempt a direct lookup of the namespace as an instance namespace.

除了最后一个视图名作为name标记来识别,之前的每一个名称首先是作为应用命名空间来识别的(第一条),如果找不到符合的应用命名空间则直接作为实例命名空间来识别(第五条)。
当识别出应用命名空间的时候,再看当前应用有没有定义(即current_app,这里比较容易引起误解,这个当前应用并非应用命名空间,恰恰相反,它是指实例命名空间),如果定义了,直接在之前的已经确认的应用命名空间的所属的实例命名空间列表下寻找current_app的值(第二条)。
如果在实例命名空间列表下找不到current_app的值,那么它会寻找默认的实例命名空间,即名称与应用命名空间相同的实例命名空间。(第三条)
如果连默认的实例命名空间都找不到,那么django会返回最后一个部署的实例命名空间的URL。(第四条)

我们还是通过具体的例子来说明反向解析机制吧。
之前的例子里定义了app1模块和app2模块,再分别生成两个它们的实例。

# urlTest.urls.py
from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^app2/first/', include('app2.urls', namespace='first', app_name='app2')),
    url(r'^app2/second/', include('app2.urls', namespace='second', app_name='app2')),
    url(r'^app1/third/', include('app1.urls', namespace="third", app_name='app1')),
    url(r'^app1/fourth/', include('app1.urls', namespace="fourth", app_name='app1')),
]

# app1.views.py
from django.core.urlresolvers import reverse
from django.http import HttpResponse
import pdb
def index(request, string):
    pdb.set_trace()
    return HttpResponse(string, 'text/plain')

在pdb的测试环境下我们使用reverse函数分别确定。

(Pdb) reverse('first:index')
u'/app2/first/'
(Pdb) reverse('second:index')
u'/app2/second/'
(Pdb) reverse('third:index')
u'/app1/third/'
(Pdb) reverse('fourth:index')
u'/app1/fourth/'

我们可以看到,实例命名空间能够唯一确定整个项目的URL。

(Pdb) reverse('app1:index')
u'/app1/fourth/'
(Pdb) reverse('app2:index')
u'/app2/second/'

当我们使用应用命名空间的时候,django反向解析机制在没有提供current_app的情况下又找不到默认的实例命名空间,只能返回最后一个部署的实例命名空间。

(Pdb) reverse('app1:index', current_app='third')
u'/app1/third/'
(Pdb) reverse('app1:index', current_app='fourth')
u'/app1/fourth/'
(Pdb) reverse('app2:index', current_app='first')
u'/app2/first/'
(Pdb) reverse('app2:index', current_app='second')
u'/app2/second/'

在提供了实例命名空间之后,即使是使用应用命名空间也能唯一确定URL。
最后我们重新添加默认实例命名空间。

# urlTest.urls.py
from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^app2/default/', include('app2.urls', namespace='app2', app_name='app2')),
    url(r'^app2/first/', include('app2.urls', namespace='first', app_name='app2')),
    url(r'^app2/second/', include('app2.urls', namespace='second', app_name='app2')),
    url(r'^app1/default/', include('app1.urls', namespace="app1", app_name='app1')),
    url(r'^app1/third/', include('app1.urls', namespace="third", app_name='app1')),
    url(r'^app1/fourth/', include('app1.urls', namespace="fourth", app_name='app1')),
]

# pdb
(Pdb) reverse('app1:index')
u'/app1/default/'
(Pdb) reverse('app2:index')
u'/app2/default/'

最后还要提醒的是,千万不要以为不同应用下可以有相同的实例,namespace必须是unique!

from django.conf.urls import url,include
from django.contrib import admin
from app import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    # 静态路由
    url(r'^login/',views.login),        # 如 http://127.0.0.1:8080/login
    # 为路由取别名,这样,在地址修改的时候,前端不需要修改地址
    url(r'^register/',views.register,name='reg'),
    # 动态路由,可以用来做分页
    # 无名分组,views里面的函数名参数可任意
    url(r'^article/(\d{4})$',views.article),    # 如 http://127.0.0.1:8080/article/2017
    # 有名分组,view里面的函数名必须是year和month
    url(r'^arcticle/(?P<year>\d{4})/(?P<month>\d{2})',views.arcticle),
    # 路由分发
    url(r'^app/',include('app.urls')),
]


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python自动化运维:Django之U

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python自动化运维:Django之U

准备首先新建一个Django 项目django-admin startproject urlTest进入manage.py所在目录后./manage.py startapp app1./manage.py startpap app2此时我们
2023-01-31

Python自动化运维:Django M

QuerySet可切片使用Python 的切片语法来限制查询集记录的数目 。它等同于SQL 的LIMIT 和OFFSET 子句。>>> Entry.objects.all()[:5]      # (LIMIT 5)>>> Entry.ob
2023-01-31

Python自动化运维Django入门

随着IT运维技术日益更新,近几年运维自动化越来越火,而且学习python的人非常的火爆,尤其是python自动化运维开发,得到了很多前辈的推崇。这里我也记录一下以前学习Django的一点点心得和方法,方便以后自己查阅,如果能帮助初学者是最好
2023-01-31

Python自动化运维

psutil库获取系统运行的进程和系统利用率[root@serverc ~]# yum -y install python2[root@serverc ~]# yum -y install python2-psutil[root@serve
2023-01-31

Python自动化运维之异常处理

1、异常异常就是非正常状态,在Python中使用异常对象来表示异常。若程序在编译或运行过程中发生错误,程序的执行过程就会发生改变,抛出异常对象,程序流进入异常处理。如果异常对象没有被处理或捕捉,程序就会执行回溯(Traceback)来终止程
2023-01-31

Python 自动化运维 IPy

1.功能 对IP进行处理的模块 2.输出一个网段内的所有IP反向解析,IP类型,IP转换网段转换strNomal(0)   无返回strNomal(1)   后缀strNomal(2)   十进制strNomal(3)   lastIPIP
2023-01-31

Python 自动化运维 nmap

1.对端口扫描,查看端口状态  2.实例import sysimport nmapscan_row = []    input_data = raw_input("PLEASE INPUT: ")scan_row = input_data.
2023-01-31

Python 自动化运维 difflib

1.功能:对比文件差异 2.对比两个字符的差异生成对比HTML格式文档,将结果输入到HTML文件,用浏览器打开单文件对比多文件对比  输出格式 ( [ 匹配 ],[ 不匹配 ],[ 错误 ] )
2023-01-31

Python 自动化运维1-Python

Python安装1.下载Python2.7源安装包:  wgethttps://www.python.org/ftp/python/2.7.12/Python-2.7.12.tar.xz2.解压安装包:  tar -zxvf Python-
2023-01-31

Python 自动化运维 XlsxWri

1.操作Excel模块  2.实例import xlsxwriterworkbook = xlsxwriter.Workbook('demol.xlsx')     ##实例一个对象worksheet = workbook.add_work
2023-01-31

python自动化运维之Telnetlib的具体使用

目录前言:1.导入telnetlib库可以直接使用。2.配置服务器、用户名、密码,cmd命令等3.功能函数前言: 远程连接中兴设备(系统使用的中兴网卡)时使用的事Telnet连接,连接时设有二次验证,每次输入用户名密码和执行命令是个繁琐的过
2022-06-02

自动化运维工具Ansible之Pytho

Ansible 的Python API使用起来相当简单快捷,使用API可以将某些运维操作封装成一个带有WEB界面的操作,免去了每次执行某个操作的时候都需要SSH运行Ansible命令。官方给出的一个简单示例:import ansible.r
2023-01-31

Python 自动化运维3-Print输

Python语言之Print输出方法Print 输出方法:'-' 表示左对齐'+' 表示正号'0' 表示用0填充'f' 前指定一个最小宽度'.' 指定小数点后的精度格式:% [flag][width][.precision]typecode
2023-01-31

python怎么做自动化运维

这篇文章将为大家详细讲解有关python怎么做自动化运维,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。python的数据类型有哪些?python的数据类型:1. 数字类型,包括int(整型)、long(长
2023-06-14

自动化运维之从Python2.6 升级P

1, download Python2.7    wget https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tgz 2, 解压Python 2.7 并安装    tar -xzvf 
2023-01-31

python自动化运维的连接方法

这篇文章给大家分享的是有关python自动化运维的连接方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚本语言,其最初的设
2023-06-14

Golang 助力运维自动化,运维利器

运维自动化利器:golanggolang 凭借其高并发性、跨平台性和易用性,成为运维自动化的强大利器:高并发性:协程机制高效处理并发任务。跨平台性:可执行二进制文件在不同操作系统上运行。简单易用:语法简洁,上手快速。通过 golang,运维
Golang 助力运维自动化,运维利器
2024-04-08

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录