在前面我们知道,Django启动之前会执行admin.py中的autodiscover()方法.

def autodiscover():
autodiscover_modules('admin', register_to=site)

在这个方法里,既然autodiscover_modules能执行admin.py文件,那当然也可以执行别的py文件.

如果想让autodiscover_modules执行自定义的py文件,该怎么做呢?

在app01的apps.py文件的App01Config类中,定义ready方法

然后导入autodiscover_modules模块,让autodiscover_modules来执行自定义的py文件

    from django.apps import AppConfig

    class App01Config(AppConfig):
name = 'app01' def ready(self):
from django.utils.module_loading import autodiscover_modules autodiscover_modules("aaaa")

这样,程序在启动的时候就会在项目所有的目录下查找并调用autodiscover_modules方法来执行aaaa.py文件

在app01目录下创建aaaa.py文件,在aaaa.py文件中打印"hello world!"

可以看到在项目启动之前就会在后台打印"hello world!"了.

项目运行到这里,下一步就是要生成URL了,这里又是怎么实现的呢???

新建一个text_url项目,包含appo1的应用,在项目的urls.py中配置url

urlpatterns = [
url(r'^index/$',views.index),
]

在app01的views.py中定义相应的视图函数index

    from django.shortcuts import render,HttpResponse

    def index(request):

        return HttpResponse("ok")

以默认端口启动项目,打开浏览器输入地址http://127.0.0.1:8000/index/

我们既然可以在views.py生定义视图函数,当然也可以直接在urls.py中定义视图函数index

    from django.shortcuts import render,HttpResponse

    def index(request):

        return HttpResponse("aaaaaa")

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

重启项目,刷新浏览器,可以看到

这样也完成同样的路由匹配.

除了上面的两种路由定义方法,我们还可以使用include方法来实现路由转发功能.

    from django.conf.urls import url,include

    urlpatterns = [
url(r'^index/$',index),
url(r'^app01/',include("url_test1"))
]

include方法中,其参数表面是一个字符串,其实际是一个文件路径.

按照上面定义的方式,在app01这个应用目录下创建url_test1文件

url_test1文件内容如下

    from django.conf.urls import url,include

    urlpatterns = [
url(r'^index/$',index),
]

为什么使用include方法也可以生成url,使用路由转发的功能呢?

打开include方法,可以看到

    def include(arg, namespace=None, app_name=None):
... # 此处省略 if isinstance(urlconf_module, six.string_types):
urlconf_module = import_module(urlconf_module)
patterns = getattr(urlconf_module, 'urlpatterns', urlconf_module)
app_name = getattr(urlconf_module, 'app_name', app_name)
if namespace and not app_name:
warnings.warn(
'Specifying a namespace in django.conf.urls.include() without '
'providing an app_name is deprecated. Set the app_name attribute '
'in the included module, or pass a 2-tuple containing the list of '
'patterns and app_name instead.',
RemovedInDjango20Warning, stacklevel=2
) namespace = namespace or app_name
... # 此处省略 return (urlconf_module, app_name, namespace)

`include方法执行完成以后,返回的数据是一个元组类型.

既然include方法返回的数据类型是元组类型,那么在app01应用目录下的url_test1.py中,也可以直接以元组的方式取代include方法.

    from django.conf.urls import url
from django.shortcuts import HttpResponse def index(request): return HttpResponse("bbbbbb") urlpatterns = [
# url(r'^admin/', admin.site.urls),
url(r'^index/$',index),
]

重启项目,浏览器地址更改为http://127.0.0.1:8000/app01/index/

include方法中,返回的元组有三个元素,第一个元素是urlconf_module

include方法中,有一个判断方法

if isinstance(urlconf_module, six.string_types):
urlconf_module = import_module(urlconf_module)
patterns = getattr(urlconf_module, 'urlpatterns', urlconf_module)
app_name = getattr(urlconf_module, 'app_name', app_name)

由此可以知道如果urlconf_module是字符串类型,就以字符串方式导入了urlconf_module模块.

导入模块后,从模块中获取urlpatterns,如果没有urlpatterns就使用默认值urlconf_module

所以include方法返回的数据第一个元素就是urls.py中include方法的参数.

而使用include方法进行路由分发时,被分发的路由中也会有urlpatterns

所以进行路由分发时,urls.py文件也可以写成下面的样子

urlpatterns = [
url(r'^app01/',(url_test1,"test1","test2")),
]

在app01目录的url_test1文件内容如下

    from django.conf.urls import url
from django.shortcuts import HttpResponse def index(request): return HttpResponse("cccccc") urlpatterns = [
url(r'^index/$',index),
]

重启项目,刷新浏览器

在这里url_test1做为元组的一个元素,其可以是模块名,也可以是列表

可以用url_test1文件中的urlpatterns替换urls.py文件中的url_test1,这样一来项目的urls.py内容就跟下面的代码一样了

    from django.conf.urls import url,include
from django.contrib import admin
from app01 import views
from app01 import url_test1
from django.shortcuts import render,HttpResponse def index(request):
return HttpResponse("aaaaaa") urlpatterns = [
# url(r'^admin/', admin.site.urls),
# url(r'^index/$',index),
# url(r'^app01/',include("app01.url_test1")),
url(r'^app01/',([ url(r'index/',index), ],"test1","test2")),
]

重启项目,刷新浏览器,可以看到

可以看到,项目已经可以成功运行起来了

按照上面的步骤,一个项目的url可以再次进行分发

    urlpatterns = [
url(r'^app01/',([ url(r'index1/',([
url(r'index2/',index),
],"test3","test4")), ],"test1","test2")),
]

重启项目,浏览器打开http://127.0.0.1:8000/app01/index1/index2/index

现在有了index视图函数,当然也可以有其他的视图函数

    urlpatterns = [
url(r'^app01/',([ url(r'index1/',([
url(r'index2/',index),
url(r'index2/add',index),
url(r'index2/(\d+)/delete',index),
url(r'index2/(\d+)/change',index),
],"test3","test4")), ],"test1","test2")),
]

这就是在Django后台进行数据表管理时使用的增删查改的urlr的生成方式

/userinfo/
/userinfo/add
/userinfo/(\d+)/delete
/userinfo/(\d+)/change

再把上面urlpatterns中的url改变一下

    urlpatterns = [
url(r'^admin/',([ url(r'app01/',([
url(r'userinfo/',index),
url(r'userinfo/add',index),
url(r'userinfo/(\d+)/delete',index),
url(r'userinfo/(\d+)/change',index),
],"test3","test4")), ],"test1","test2")),
]

把上面的url组合在一起,,就变成完完全全的Django后台进行数据表管理时使用的增删查改的url了.

Django中url的生成过程详解的更多相关文章

  1. django中的路由控制详解

    一 Django中路由的作用 二 简单的路由配置 三 有名分组 四 路由分发 五 反向解析 六 名称空间 七 django2.0版的path 一 Django中路由的作用 URL配置(URLconf) ...

  2. Python中url标签使用详解

    url标签: 1.在模板中,我们经常要使用一些url,实现页面之间的跳转,比如某个a标签中需要定义href属性.当然如果通过硬编码的方式直接将这个url固定在里面也是可以的,但是这样的话,对于以后进行 ...

  3. django中的request对象详解

    Request 我们知道当URLconf文件匹配到用户输入的路径后,会调用对应的view函数,并将  HttpRequest对象  作为第一个参数传入该函数. 我们来看一看这个HttpRequest对 ...

  4. PHP和javascript中url编码解码详解

    在实际开发中,我们可能会遇到路径编码解码的问题,下面总结了一下: PHP中: 1.urlencode(编码),urldecode(解码) $a = urlencode('http://www.baid ...

  5. Django——URL详解/Django中URL是如何与urls文件匹配的

    URL标准语法 protocol://hostname[:port]/path/[:parameters][?query]#fragment https://i.cnblogs.com/EditPos ...

  6. Django model 中的 class Meta 详解

    Django model 中的 class Meta 详解 通过一个内嵌类 "class Meta" 给你的 model 定义元数据, 类似下面这样: class Foo(mode ...

  7. 029:url标签使用详解

    url标签使用详解: 在模版中,我们经常要写一些 url ,比如某个 a 标签中需要定义 href 属性.当然如果通过硬编码的方式直接将这个 url 写死在里面也是可以的.但是这样对于以后项目维护可能 ...

  8. Scala 深入浅出实战经典 第57讲:Scala中Dependency Injection实战详解

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  9. Scala 深入浅出实战经典 第55讲:Scala中Infix Type实战详解

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...

随机推荐

  1. CTFCrackTools在Windows下显示A Java Exception has occurred的解决方案

    打CTF做密码学的人一定少不了用这个工具,CTFCrackTools,这个几乎可以号称密码学的神器,但是呢,最近博主遇到了一些麻烦事,每次打开的时候都是显示A Java Exception has o ...

  2. CodeForces832-B. Petya and Exam

    补的若干年以前的题目,水题,太菜啦_(:з」∠)_    B. Petya and Exam time limit per test 2 seconds memory limit per test 2 ...

  3. hdu_1025(LIS Nlog(N)算法)

    题意:自己慢慢读吧.大概就是道路两边建路,给出建路需求,要求两条路不能有交叉,问最多可以建多少条路. 题解:一看数据范围500000,应该是dp,再画个图模拟一下,发现实质就是求最长上升子序列,很自然 ...

  4. Linux shell编程命令-Linux基础环境命令学习笔记

    1.正则表达式 1)^开始 *前一个字符重复0次以上 + 1次以上 ? 0次或者1次 . 一个任意字符(.*连用) {m,n} m到n次 [0-9][a-z] 任意数字或字母 $结束字符 2)sed和 ...

  5. Zigbee Class 直播公告2016-10-10

    周一我们将开始本期课程的首次直播, 详情如下: 场次 第一场 阶段 入门 开始时间 2016-10-10  19:00 结束时间 不定 斗鱼地址 douyu.com/zigbeeclass 内容 本期 ...

  6. Winform 控件的入门级使用(一)

    开始总结一下控件的基本用法,方便以后查阅. 一.Label Label 的使用频率很高,基本上也没有什么难度. #region Winform //label label.Text = "这 ...

  7. 如何在Chrome下使用Postman进行rest请求测试

    在web和移动端开发时,常常会调用服务器端的restful接口进行数据请求,为了调试,一般会先用工具进行测试,通过测试后才开始在开发中使用.这里介绍一下如何在chrome浏览器利用postman应用进 ...

  8. TCP长连接和短连接的区别

    当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次握手的,而释放则需 ...

  9. 5dfda1332b67817b0f2d7839242021ce'Java数据结构和算法

    1.return 一个空的集合,而不是 null 如果一个程序返回一个没有任何值的集合,请确保一个空集合返回,而不是空元素.这样你就不用去写一大堆 "if else" 判断null ...

  10. VM安装Ubuntu问题合集(无法联网、中文界面设置、中文输入法etc)

    经常使用VM安装Ubuntu,安装系统的步骤跟着系统提示一步步下来就行,但总是遇到一些问题,这里记录一下常遇到的问题,以及自己解决的办法: 1.无法联网: 状况:Ubuntu不能联网,联网地方一直在闪 ...