92django_url
admin
2023-07-08 12:44:52
0

 

目录

url 1

去掉urlstatic硬编码:... 1

url反向解析:... 2

url命名空间:... 2

django如何处理一个请求:... 3

错误处理:... 6

 

 

 

url

 

mysite/mysite/urls.py   #入口url

def url(regex, view, kwargs=None, name=None):   #viewfunction object,不是函数调用;view函数的第一参数永远是request,不探讨CBVview函数的返回值永远是HttpResponse对象,显式或隐式;

url(r'^hello/$', hello),   #django默认会给url后加/,此处定义,hello前不带/hello后一定要有/,这样即使用户访问http://127.0.0.1:8000/hello也会自动跳到http://127.0.0.1:8000/hello/上;若此处配置为r'^hello$',用户访问http://127.0.0.1:8000/hello/,访问的地址无论是否带/都会报404;所以记住,此处定义的urlhello前没有/hello后要有/

url(r'^$', views.index, name='index')   #app中的urls.py,可通过name反解出url

url(r'^polls/', include('polls.urls')),   #项目中的urls.pyinclude里是str,在用到时才动态导入;

 

url反向解析:

正解析,url-->view

反解析,view-->url

 

>>> from django.shortcuts import reverse

>>> reverse('detail',kwargs={'question_id':1})   #可以根据路由名称,返回具体的路径;未指明namespace的,用reverse(路由name);指明namespace,用reverse(命名空间namespace:路由name);路由nameviews.方法名

'/polls/1/'

 

另,reverse_lazy(),为解决循环依赖;

 

在模板中,使用url模板标签;

py代码中,使用django.core.urlresolvers.reverse()

在更高层与处理django模型实例相关的代码中,用get_absolute_url()

 

 

url命名空间:

app namespaceinstance namespace

方便查找特定view的具体路径信息;

通常使用app namespace

app有多个include,使用instance namespace

 

app namespace

 

mysite/polls/urls.py   #1,建议使用,在app_name/urls.py中定义

app_name = 'polls'

 

mysite/mysite/urls.py

url(r'^polls/', include('polls.urls', app_name='polls')),   #2,在项目下定义mysite/mysite/urls.py

 

 

instance namespace

instance级别,名称不可以重复;

 

mysite/mysite/urls.py   #总路由文件

url(r'^polls/', include('polls.urls', namespace='polls')),

 

 

例:

mxonline/organization/urls.py   #某一app

urlpatterns = [

    url(r'^list/$', OrgView.as_view(), name='org_list'),

    url(r'^add_ask/$', AddUserAskView.as_view(), name='add_ask'),

]

 

mxonline/mxonline/urls.py   #总路由文件

    url(r'^org/', include('organization.urls', namespace='org')),

 

 

 

django如何处理一个请求:

响应流程:

92django_url

1、项目启动后,根据mysite/mysite/settings.pyROOT_URLCONF = 'mysite.urls'决定根urlconf

2mysite/mysite/urls.pyurlpatterns是由drango.conf.urls.url()函数调用(或实例)组成的列表;

3django依次匹配每个url模式,在与请求的url匹配的第一个模式停下来;

4、一旦其中的一个正则表达式匹配上,django将导入并调用给出的view(是一个简单的py函数或一个基于类的view),view将获得如下参数:

1HttpRequest实例;

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

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

5、如果没有匹配到正则表达式,或者如果过程中抛异常,django将调用一个适当的错误处理view

 

92django_url

92django_url

注:

图中middlewares是一个整体,有多个功能;

 

92django_url

主路由文件的urlpatterns列表中由上至下顺序查找对应的路由规则,若有include则再进入子的urlpatterns列表由上至下查询;

由上至下的顺序,有可能上面的路由屏蔽掉下面的路由,带来非预期的结果;

 

 

 

例,多种url

urlpatterns = [

         url(r'^article/2003/$', views.special_case_2003),

         url(r'^article/([0-9]{4})/$', views.year_archive),

         url(r'^article/([0-9]{4})/([0-9]{2})/$', views.month_archive),

         url(r'^article/(?P[0-9]{4})/(?P[0-9]{2})/(?P[0-9]{2})/$', views.article_detail),

]

注:

若要从url中捕获一个值,只需要加上()

匹配的路径,不需要在前面加/,因为每个url都有,如应是article而不是/article

每个正则表达式前面的r约定加上,目的告诉py这个字符串是raw原始的,字符串中的任何字符都不应转义;

默认捕捉到的都是字符串;

/article/2005/03/article/2019/01/?blog=hi,请求将匹配urlpatterns的第3个元素,django将调用函数views.month_archive(request,'2005','03')

/article/2019/1/不匹配任何模式;

/article/2003/将匹配列表第一个元素,不是第二个,按顺序依次匹配;

/article/2003,不匹配任何一个模式;

/article/2019/01/03/,请求将调用views.article_detail(request,year='2019',month='01',day='03')

 

例,url多种组合:

url(r'^community/', include('django_website.aggregator.urls')),

url(r'^contact/', include('django_website.contact.urls')),

 

url(r'^reports/(?P[0-9]+)/$', credit_views.report),

url(r'^charge/$', credit_views.charge),

 

url(r'^$', main_views.homepage),

url(r'^help/', include('apps.help.urls')),

url(r'^credit/', include(extra_patterns)),

 

url(r'^(?P[\w-]+)-(?P\w+)/', include([

         url(r'^history/$', views.history),

         url(r'^edit/$', views.edit),

         url(r'^discuss/$', views.discuss),

         url(r'^permissions/$', views.permissions),

])),

 

url(r'^$', main_views.homepage),

url(r'^help/', include('apps.help.urls')),

url(r'^credit/', include(extra_patterns)),

 

url(r'^log/', include(other_log)),

 

url(r'^(?P\w+)/blog/', include('foo.urls.blog')),   #捕获,参数的继承

 

url(r'^$', views.blog.index),

url(r'^archive/$', views.blog.archive),

 

url(r'^blog/(?P[0-9]{4})/$', views.year_archive, {'foo': 'bar'}),   #传递额外选项

 

 

错误处理:

 

django找不到一个匹配请求的url正则表达式时,或当抛出一个异常时,django将调用一个错误处理view

 

默认错误处理viewdjango.conf.urls中:

handler400 = 'django.views.defaults.bad_request'

handler403 = 'django.views.defaults.permission_denied'

handler404 = 'django.views.defaults.page_not_found'

handler500 = 'django.views.defaults.server_error'

 

 

 

urlpatterns = [...]

urlpatterns += [...]   #常用,便于分组;

 

 

 

 

 


上一篇:94django_template

下一篇:91django_基本使用

相关内容

热门资讯

美前副总统:共和党失去了方向,... 2026年是美国的中期选举年,共和党选情不利,可能在年底的选举中遭遇挫败。美国前副总统彭斯5月31日...
南枝原来去过中国?《给阿嬷的情... 《给阿嬷的情书》票房口碑双丰收,目前票房已突破13亿。凤凰卫视最新一期《问答神州》专访了该片导演蓝鸿...
法国海军扣押一艘俄“影子舰队”... 近日,法国海军在大西洋海域扣押了一艘据称从俄罗斯摩尔曼斯克出发的油轮,引发俄方强烈不满。俄新社6月1...
凤凰晚报丨面粉染头模仿黄仁勋,... 今日人物【面粉染头模仿黄仁勋,农村青年走红后称遭“法务”警告】“先赔偿5000元肖像侵权使用费,再删...
亲特朗普极右派候选人领跑哥伦比... 【文/观察者网 熊超然】当地时间5月31日,哥伦比亚总统选举拉开帷幕,首轮投票计票工作已完成逾99%...
2026年度网络举报系列宣传活... 5月28日至29日,以“每一件举报,都是共治的力量——豫你e行 同心护网”为主题的2026年度网络举...
中原首例帝企鹅DNA性别鉴定!... 近日,郑州海昌海洋公园正式对外公布中原首对人工繁育的帝企鹅萌宝的DNA性别鉴定报告。这是中原首个将 ...
我国科学家为细胞信号“导航”开... 新华社济南5月31日电(记者张力元)人体细胞犹如一座精密的通信城市,每天都有大量“指令”穿梭传递,调...
极端大风突袭哈尔滨!过山车停摆... 极目新闻记者 詹钘5月31日,受强对流天气影响,哈尔滨国际会展中心体育场相关设施受到损坏,原计划当晚...
三原电缆取得电缆接头连接用防护... 国家知识产权局信息显示,上海三原电缆附件有限公司取得一项名为“一种电缆接头连接用防护结构”的专利,授...