Django中url的生成过程详解
在前面我们知道,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的生成过程详解的更多相关文章
- django中的路由控制详解
一 Django中路由的作用 二 简单的路由配置 三 有名分组 四 路由分发 五 反向解析 六 名称空间 七 django2.0版的path 一 Django中路由的作用 URL配置(URLconf) ...
- Python中url标签使用详解
url标签: 1.在模板中,我们经常要使用一些url,实现页面之间的跳转,比如某个a标签中需要定义href属性.当然如果通过硬编码的方式直接将这个url固定在里面也是可以的,但是这样的话,对于以后进行 ...
- django中的request对象详解
Request 我们知道当URLconf文件匹配到用户输入的路径后,会调用对应的view函数,并将 HttpRequest对象 作为第一个参数传入该函数. 我们来看一看这个HttpRequest对 ...
- PHP和javascript中url编码解码详解
在实际开发中,我们可能会遇到路径编码解码的问题,下面总结了一下: PHP中: 1.urlencode(编码),urldecode(解码) $a = urlencode('http://www.baid ...
- Django——URL详解/Django中URL是如何与urls文件匹配的
URL标准语法 protocol://hostname[:port]/path/[:parameters][?query]#fragment https://i.cnblogs.com/EditPos ...
- Django model 中的 class Meta 详解
Django model 中的 class Meta 详解 通过一个内嵌类 "class Meta" 给你的 model 定义元数据, 类似下面这样: class Foo(mode ...
- 029:url标签使用详解
url标签使用详解: 在模版中,我们经常要写一些 url ,比如某个 a 标签中需要定义 href 属性.当然如果通过硬编码的方式直接将这个 url 写死在里面也是可以的.但是这样对于以后项目维护可能 ...
- Scala 深入浅出实战经典 第57讲:Scala中Dependency Injection实战详解
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- Scala 深入浅出实战经典 第55讲:Scala中Infix Type实战详解
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...
随机推荐
- 使用python写一个简单的C段扫
纠结C段查询N久..刚刚拿骚棒FD去抓御剑的包,发现emmm...申请了必应的Key 然后去拿必应API查.这里疼[心]原本也想去弄的.但是人懒. 然后就没有然后了. 代码: 生成IP段的脚本图1 # ...
- 51Nod 1003 阶乘后面0的数量(数学,思维题)
1003 阶乘后面0的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 n的阶乘后面有多少个0? 6的阶乘 = 1*2*3*4*5*6 = 720 ...
- bzoj:1230: [Usaco2008 Nov]lites 开关灯
Description Farmer John尝试通过和奶牛们玩益智玩具来保持他的奶牛们思维敏捷. 其中一个大型玩具是牛栏中的灯. N (2 <= N <= 100,000) 头奶牛中的每 ...
- return机制
C/C++中,函数内部的一切变量(函数内部局部变量,形参 )都是在其被调用时才被分配内存单元.子函数运行结束时,所有局部变量的内存单元会被系统释放.形参和函数内部的局部变量的生命期和作用域都是在函数内 ...
- js时间戳与时间日期间相互转换
今天在工作中要将获取到的时间转换为时间戳,一时间竟不知道怎么用,于是不得不去查询资料,这里特地做个笔记. 1.将日期转换为时间戳. 要将日期转换为时间戳,首先得先获取到日期,这里可以直接指定日期,或者 ...
- Java入门篇(六)——类和对象
写到这里终于写到了入门篇的最后一个知识点了.类和对象是Java中经常被提到的两个词汇,实际上可以将类看作对象的载体,它定义了对象所具有的功能.Java是面向对象的语言,因此掌握类与对象是学习Java语 ...
- Oracle_建表
Oracle_建表 --设计要求: --建立一张用来存储学生信息的表 --字段包含学号.姓名.性别,年龄.入学日期.班级,email等信息 create table student( ...
- cnzz友盟怎么安装网站统计代码监控网站流量
做网站的都知道cnzz统计,它是用来统计网站流量的,可以分析网站数据,进行更好的对网站优化,下面我教大家怎么添加统计代码 工具/原料 cnzz 方法/步骤 打开百度搜索"cnzz友盟&quo ...
- 浅谈 C/S 和 B/S 架构
概述 在这个信息急剧膨胀的社会,我们不得不说人类正进入一个崭新的时代,那就是信息时代.信息时代的一个主要而显著的特征就是计算机网络的应用.计算机网络从最初的集中式计算,经过了Client/Server ...
- 如何解决wamp中apache外部IP访问问题
# # Some examples: #ErrorDocument 500 "The server made a boo boo." #ErrorDocument 404 /mis ...