urlpatterns 在url文件中是一个url映射列表。在1.8以后的django版本中可直接为列表形式或者也可以用patterns函数生成。在1.7及以前的版本中则是由patterns函数生成。系统会自动遍历url文件中的urlpatterns列表然后进行对应的处理函数查找。当url有重复的情况则以找到的第一个为准。
先说说Django怎么处理请求:
- 一旦生成url页面请求,请求传递到urls.py;
- Django去urlpatterns中匹配链接(Django会在匹配到的第一个就停下来);
- 一旦匹配成功,就会去执行,path后面的方法,Django便会给出相应的view页面(该页面可以为一个Python的函数,或者基于view(Django内置的)的类),也就是用户看到的页面;
- 若匹配失败,则出现错误的页面。
编写urlpatterns
1.views中的简单函数
#urls.py from app import views #这里的app是你自己的应用的名字 from django.urls import path urlpatterns = [ path(\'index/\', views.index, name=\'index\'), ]
该方法对应view.py中的函数为:
#views.py def index(request): ... return render(request,\'index.html\')
2.从views中继承的类
#urls.py from app.views import LoginView from django.urls import path urlpatterns = [ path(\'login/\', LoginView.as_view(), name=\'login\'), ]
该方法对应的view.py中为:
#views.py class LoginView(View): #请求为get时 def get(self,request): ... return render(request, \'login.html\') #请求为post时 def post(self,request): ... return render(request,\'login.html\')
当你从其他地方比如你的应用中也新建了一个文件叫urls.py,这是可以用第三种方法:
3.导入其他的URL文件(适用于urls.py文件不止一个时)
#urls.py(系统默认的) from django.urls import include, path urlpatterns = [ path(\'login/\', include(\'app.urls\'))#假设自己新建的urls在app(应用中) ]
再说urlpatterns
若觉得上述方法依然不够逼格,可以试试正则形式的urlpatterns,具体用法为
导入包时由
from django.urls import path
更改为
from django.urls import re_path
相应的urlpatterns构造也变为
urlpatterns = [ re_path(r\'^articles/(?P<year>[0-9]{4})/$\', view.year, name=\'article\'), re_path(r\'^blog/(page-(\d+)/)?$\',blog_articles), ]
这样子可以很方便的匹配到具体某一年的文章,而不用对“每一年”都写一个path,这样子可以极大的减轻工作量。
还有一种方法
#urls.py from app.views import LoginView from django.conf.urls import url #注意这里 urlpatterns = [ url(r\'^login/$\', LoginView.as_view(), name=\'login\'), #还有这里 ]
总结:
path方法适用于页面较少的网站,re_path可以利用正则表达的优势适用于较多的页面的网站
匹配失败出现错误页面
- handler400
- handler403
- handler404
- handler500
若有兴趣可以上官网看一下
当你的项目上线时则需要对这些错误进行自己的定义,总不能人家去访问你的页面了,404还是django的错误页面吧。。。
自己定义时则需进行全局定义
即不能包含在上述urlpatterns中
#urls.py handler404 = \'app.views.page_not_found\'