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'