细说Django urls.py urlpatterns

由于自己对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'

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值