目錄
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設,商丘企業(yè)網(wǎng)站建設,商丘品牌網(wǎng)站建設,網(wǎng)站定制,商丘網(wǎng)站建設報價,網(wǎng)絡營銷,網(wǎng)絡優(yōu)化,商丘網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。url 1
去掉url和static硬編碼:...1
url反向解析:...2
url命名空間:...2
django如何處理一個請求:...3
錯誤處理:...6
mysite/mysite/urls.py?? #入口url
def url(regex, view, kwargs=None, name=None):?? #view是function object,不是函數(shù)調(diào)用;view函數(shù)的第一參數(shù)永遠是request,不探討CBV,view函數(shù)的返回值永遠是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;所以記住,此處定義的url,hello前沒有/,hello后要有/;
url(r'^$', views.index, name='index')?? #app中的urls.py,可通過name反解出url;
url(r'^polls/', include('polls.urls')),?? #項目中的urls.py,include里是str,在用到時才動態(tài)導入;
正解析,url-->view;
反解析,view-->url;
>>> from django.shortcuts import reverse
>>> reverse('detail',kwargs={'question_id':1})?? #可以根據(jù)路由名稱,返回具體的路徑;未指明namespace的,用reverse(路由name);指明namespace,用reverse(命名空間namespace:路由name);路由name即views.方法名
'/polls/1/'
另,reverse_lazy(),為解決循環(huán)依賴;
在模板中,使用url模板標簽;
在py代碼中,使用django.core.urlresolvers.reverse();
在更高層與處理django模型實例相關的代碼中,用get_absolute_url();
app namespace和instance 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')),
響應流程:
1、項目啟動后,根據(jù)mysite/mysite/settings.py中ROOT_URLCONF = 'mysite.urls'決定根urlconf;
2、mysite/mysite/urls.py中urlpatterns是由drango.conf.urls.url()函數(shù)調(diào)用(或?qū)嵗┙M成的列表;
3、django依次匹配每個url模式,在與請求的url匹配的第一個模式停下來;
4、一旦其中的一個正則表達式匹配上,django將導入并調(diào)用給出的view(是一個簡單的py函數(shù)或一個基于類的view),view將獲得如下參數(shù):
1個HttpRequest實例;
如果匹配的正則表達式返回了沒有命名的組,那么正則表達式匹配的內(nèi)容將作為位置參數(shù)提供給view;
關鍵字參數(shù)由正則表達式匹配的命名組組成,但可被django.conf.urls.url()的可選參數(shù)kwargs覆蓋;
5、如果沒有匹配到正則表達式,或者如果過程中拋異常,django將調(diào)用一個適當?shù)腻e誤處理view;
注:
圖中middlewares是一個整體,有多個功能;
主路由文件的urlpatterns列表中由上至下順序查找對應的路由規(guī)則,若有include則再進入子的urlpatterns列表由上至下查詢;
由上至下的順序,有可能上面的路由屏蔽掉下面的路由,帶來非預期的結(jié)果;
例,多種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<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),
]
注:
若要從url中捕獲一個值,只需要加上();
匹配的路徑,不需要在前面加/,因為每個url都有,如應是article而不是/article;
每個正則表達式前面的r約定加上,目的告訴py這個字符串是raw原始的,字符串中的任何字符都不應轉(zhuǎn)義;
默認捕捉到的都是字符串;
如/article/2005/03或/article/2019/01/?blog=hi,請求將匹配urlpatterns的第3個元素,django將調(diào)用函數(shù)views.month_archive(request,'2005','03');
如/article/2019/1/不匹配任何模式;
如/article/2003/將匹配列表第一個元素,不是第二個,按順序依次匹配;
/article/2003,不匹配任何一個模式;
如/article/2019/01/03/,請求將調(diào)用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<id>[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<page_slug>[\w-]+)-(?P<page_id>\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<username>\w+)/blog/', include('foo.urls.blog')),?? #捕獲,參數(shù)的繼承
url(r'^$', views.blog.index),
url(r'^archive/$', views.blog.archive),
url(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive, {'foo': 'bar'}),?? #傳遞額外選項
當django找不到一個匹配請求的url正則表達式時,或當拋出一個異常時,django將調(diào)用一個錯誤處理view;
默認錯誤處理view,django.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 += [...]?? #常用,便于分組;
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
文章標題:92django_url-創(chuàng)新互聯(lián)
分享鏈接:http://jinyejixie.com/article36/dchopg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、云服務器、網(wǎng)站內(nèi)鏈、響應式網(wǎng)站、定制開發(fā)、全網(wǎng)營銷推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)