细说Django urls.py urlpatterns_django urls urlpatterns-程序员宅基地

技术标签: # Django  Python  

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

 

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lht_521/article/details/80580118

智能推荐

【完美解决系列】duplicate entry: com/google/gson/annotations/Expose.class-程序员宅基地

文章浏览阅读1.1w次,点赞8次,收藏5次。项目在引入Retrofit2时,运行项目时会报出以下错误:Error:Execution failed for task ':app:transformClassesWithJarMergingForDebug'.> com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicate e_duplicate entry: com/

Android开发规范,性能优化-程序员宅基地

文章浏览阅读3.7k次。本文带您全面了解Android开发规范,其中包括Android编码规范,Android性能优化和Android UI优化,读完绝对不会后悔的好文章。一、Android编码规范1.java代码中不出现中文,最多注释中可以出现中文2.局部变量命名、静态成员变量命名只能包含字母,单词首字母出第一个外,都为大写,其他字母都为小写

设备驱动调试和移植的一般方法-程序员宅基地

文章浏览阅读97次。做linux底层软件工作也有两年了,算上研究生时期对底层软件的研究,加起来也快四年了。慢慢地发现有必要总结一些一般性的方法了。因为一般性的方法有宏观上的指导意义,以后调试和移植驱动时,经常性地回味这些一般性的方法可以防止自己犯同样的错误,进而少走弯路,以最高的效率完成工作。当谈到底层软件,我们一般都会想到bootloader、BSP、device driver、linux kernel等...

iOS -xcode 10 出现 :-1: Multiple commands produce ‘/Users/.../Library/Developer/Xcode/DerivedData/...._multiple commands produce '/users/yanyanli/library-程序员宅基地

文章浏览阅读6.4k次,点赞4次,收藏2次。错误提示如下::-1: Multiple commands produce '/Users/.../Library/Developer/Xcode/DerivedData/.../Build/Products/Dev-iphonesimulator/TLYShyNavBar/TLYShyNavBar.framework/Info.plist':1) Target 'TLYShyNavBar' has copy command from '/Users/.../Desktop/Workspace/_multiple commands produce '/users/yanyanli/library/developer/xcode/derivedda

【图像去噪】基于matlab GUI中值+小波+维纳+滤波器图像去噪(含PSNR)【含Matlab源码 616期】_matlab图像去噪-程序员宅基地

文章浏览阅读1.9k次,点赞4次,收藏15次。中值+小波+维纳+滤波器图像去噪(含PSNR)完整代码,直接运行,适合小白!可提供运行操作视频!_matlab图像去噪

faster rcnn解读【原理篇】-程序员宅基地

文章浏览阅读3.2k次。看了DL4CV的第三卷的15章faster rcnn之后,收获很多,特此做一下记录一.RCNNRCNN一共分为四步:step1:输入图片step2:采用selective search的方法获取潜在的roi,一共提取了2000个潜在roi,然后放入conv当中进行训练step3:使用迁移学习【用到了conv层】方法,提取step2的特征,从而获得最终的roiste...

随便推点

最热开源项目,以及java基础整理_软件java项目最热算法?-程序员宅基地

文章浏览阅读186次。1、halo,这是一个轻快,简洁,功能强大,使用Java开发的博客系统。项目地址:https://github.com/halo-dev/halo Star 61392、jeecg-boot项目地址:https://github.com/zhangdaiscott/jeecg-boot Star 2873这是一款基于代码生成器的JAVA快速开发平台!提高UI能力的同时,降低前后分离的..._软件java项目最热算法?

redis 获取不到_Redis::scan 函数时获取不到数据-程序员宅基地

文章浏览阅读1.7k次。我在redis 组件 src/Connection/Connection.php 文件里面添加了scan替代 把迭代值返回 解决了这个问题* @param mixed $iterator* @param string $key* @param array $keys** @return array*/public function scan($iterator, string $pattern ...

简单线性回归截距假设检验_线性回归分析导论(原书第5版)-程序员宅基地

文章浏览阅读779次。译者序前言第1章 导引11.1 回归与建模11.2 数据收集41.3 回归的用途71.4 计算机的角色7第2章 简单线性回归92.1 简单线性回归模型92.2 回归参数的最小二乘估计92.2.1 β0与β1的估计92.2.2 最小二乘估计量的性质与回归模型拟合132.2.3 σ2的估计142.2.4 简单线性回归模型的另一种形式152.3 斜率与截距的假设检验152.3.1 使用t检验162.3...._线性回归分析导论下载

qt MainWindow设置layout失效_mainwindow setlayout无效果-程序员宅基地

文章浏览阅读451次。正确的做法:把layout设置到centralWidget上。错误的做法:直接把layout设置到MainWindow上。_mainwindow setlayout无效果

最新网络监视工具列表_monitoring tool for database clients-程序员宅基地

文章浏览阅读1w次。 引用: 名称: 事项001 描述: 翻译由斯坦福大学维护的最新网络监视工具列表. http://www.slac.stanford.edu/xorg/nmtf/nmtf-tools.html 执行人: leechael 启动时间: 2006-04-24 _monitoring tool for database clients

[论文阅读笔记]Learning Memory-guided Normality for Anomaly Detection-程序员宅基地

文章浏览阅读3.9k次,点赞5次,收藏28次。论文发表年限:CVPR,2020作者:Hyunjong Park、Jongyoun Noh、Bumsub Ham论文下载地址:Learning Memory-guided Normality for Anomaly Detectiongithub地址:https://github.com/cvlab-yonsei/MNAD摘要:异常检测、无监督Motivation现有的方法没有考虑到正常行为(normal)的多样性。同时强大的CNN网络能够重构异常行为(abnormal),导致不能检测出异常行为