由于自己对Django系统生成的urls.py中有一部分不是特别了解,所以抽空仔细研究研究其中的相关内容。
先说说Django怎么处理请求:
- 用户在敲下你的网址并回车,生成请求;
- 请求传递到urls.py;
- Django去urlpatterns中匹配链接(Django会在匹配到的第一个就停下来);
- 一旦匹配成功,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(应用中)
]
自己的新建的urls.py和上述方法一、二构建方法相同。
至于为什么在path要加name='login'等,可以参见:为什么加name
再说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'), #还有这里
]
这中方法根据Django官方文档的说法为以后可能会废弃这种用法
总结:
path方法适用于页面较少的网站,re_path可以利用正则表达的优势适用于较多的页面的网站
匹配失败出现错误页面
- handler400
- handler403
- handler404
- handler500
若有兴趣可以上官网看一下
当你的项目上线时则需要对这些错误进行自己的定义,总不能人家去访问你的页面了,404还是django的错误页面吧。。。
自己定义时则需进行全局定义
即不能包含在上述urlpatterns中
#urls.py
handler404 = 'app.views.page_not_found'