Django 中URL和Views相关知识梳理(极简版)
提示:仅供梳理参考,很多相关的细节内容忽略。
1.URL
(1)URL匹配的规则是正则,关于正则不再赘述。
(2)URL优先级顺序:从urlpatterns的底部开始搜索,一直往上搜索,需要注意的是,并不是一搜到匹配的URL正则式就停止了,而是继续往上搜索,如果上面还有匹配的URL正则,则上面的有效,所以在urlpatterns中写url与views或者include的映射关系时,应该是细分的在上面,比较粗略的正则写下面,但如果采用'^ some RegEx$' 的精确的正则,就不存在优先级的问题。
(3)url带参:通过正则name group实现,比如'^fruit/(?P<fruit_name>[a-zA-Z]+)/',可以获取一个名为'fruit_name'的参数,该参数至少有一个字母,然后传递给相应的view函数,如:
def someMethod(request,fruit_name,extra): #extra 解释见下面的(4)
#something using fruit_name
return render(request,'demo.html',context_dict)
该函数可以是FVB或者CVB,如果是CVB可直接传递至相应的template模板,如url('^someRegEx$',TemplateView.as_view(template_name='drinks/index.html'))
(4)url的optional extra:例如 url('^someRegEx$',views.someMethod,{'extra':'extra_data'}),最后一项就是optional extra,可选的参数,该参数随url中的参数一起,可以被传入views 中的函数或者CVB指明的模板。
(5)url的name:在映射url和view函数时候,经常带一个name,如 url('^apple/$',views.appleMethod,name='apple'),这里name是为了反向代理,意思就是在html模板中可以使用{% url 'apple' %}来代表硬生生写的 'apple/$'这个url,因为如果^apple/$'变动了,所有含有硬生生写的'apple/$'都要变,非常麻烦。
(6)如果是多个app,则每个app下的name不能一样,因为这样就是多个url对应一个name,反向代理,一个name对应哪个url?不确定。一个粗暴的方法就是每个name都加后缀,但也非常不方便。所以为了可以让每个app下的name 也可以相同,引入了namespace,但namespace必须与include一起使用,所以在reverse或者模板中就可以用“namespace:name"的方法来反向代理url。
(7)【用的情况比较少】如果多个url对应同一个app(必须用多个include+namespace,是使用app_name的前提),需要在该app的url中设置app_name,,这样可以通过app_name:name(该name是该app中urlpatterns中的name)来动态的捕捉到是通过哪个url进入的该app的url。如主urls.py中有
urlpatterns = [
path('admin/', admin.site.urls),
url('^coffee-banners/',include('banners.urls',namespace='coffee-banners')),
url('^food-banners/',include('banners.urls',namespace='food-banners')) ]
banners的urls.py为:
app_name='banners_adverts'
urlpatterns=[
url('^$',views.index,name='index')
]
banners的views.py:
def index(request):
return render(request,'banners/index.html')
banners的index.html为:
{% extends '../base.html' %}
{% block body_block %}
{% url 'banners_adverts:index' %}
{% endblock %}
所以当通过/food-banners/进来时,{% url 'banners_adverts:index' %}显示的是/food-banners/如下图:

当通过/coffee-banners/进来时,{% url 'banners_adverts:index' %}显示的是/coffee-banners/如下图:

2.view
(1)view method request:是django.http.request.HttpRequest类的实例,在调用view method前,它包含了比如浏览器,Django的middleware类的一些信息。
(a)request.method(b)request.GET, request.POST(c)request.META(d)request.user。详见https://docs.djangoproject.com/en/3.1/ref/request-response/
(2)view method response:详见https://docs.djangoproject.com/en/3.1/ref/request-response/,三种生成view method response的方法,
(a)render(request,'demo.html',context_dict),该方法还有三个可选参数,'content_type',默认为'text/html',‘status'默认为200,'using',要么是'jinja2',要么'django'。(b)TemplateResponse(request,'demo.html',context_value),输入参数与render基本一样,多一个'charset'参数。
(c)
from django.http import HttpResponse
from django.template import loader,Context
response=HttpResponse()
t=loader.get_template('demo.html')
c=Context(context_dict)
response.write(t.render(c))
这是最灵活的一种方法,当视图方法的response需要高级选项时,这是一种推荐的方法。
(3)Response 的Status 和 Content-Type选项
(a) status:三位数,表示对给定的request回应的response的回应状态。比如,200是返回成功,404是未找到资源。
(b)Content-type: 是个'MIME(multipurpose Internet Mail Extensions)'的字符串类型,表面在response中的内容的类型,比如,’text/html',是一个标准的response的content type,'image/gif',表明返回的是一个GIF图像。
(c) buit-in response shortcuts and template for common HTTP Status: 404(Not Fount), 500(Internal Server Error), 400(Bad Request), and 403(Forbidden):
当django找不到页面,会自动触发404response,当django view 方法中抛出异常,会自动触发 500 response,但也可以显式地触发这些response,方法如下:
Http status code python code sample
404 from django.http import Http404
raise Http404 500 raise Exception 400 from django.core.exceptions import SuspiciousOperation
raise SuspiciousOperation 403 from django.core.exceptions import PermissionDenied
raise PermissionDenied
对于404 和500,它们还取决于 settings.py中的DEBUG的值。
也可以用定制的页面覆盖默认的这些错误代码对应的response页面。要创建一个定制的页面,必须建立个以错误代码命名的html文件,比如对于Http403错误,创建403.html放到TEMPLATES列表中的变量DIRS定义的路径下。(再一次注意,404.html和500.html仅在DEBUG=False时有效,因为为True的模式下,是要查找django项目内在的错误,所以提供了默认的带有Exception traceback 的错误页面,来方便调试,寻找错误) ,详见https://i.cnblogs.com/posts/edit-done;postId=13584840
(d)Buit-in response shortcuts for inline and streamed content
之前所有的response都建立在通过一个template来构建内容的基础上的,然而,还有很多情况,没有必要用template来输出response的内容,比如只需要一行输出'Nothing to see here",还有使用template来输出内容根本就不妥当的情况,比如redirect(Http301,Http302)
另外,比如一些response返回的是其他文本格式,如csv,详细的例子见https://docs.djangoproject.com/en/3.1/howto/outputting-csv/ , 或者pdf (from django.http import FileResponse , return FileResopnse(open('demo.pdf','rb'))).
例:该view 方法的response为下图:
def index(request):
response=HttpResponse(content_type='text/csv')
response['Content-Disposition']='attachment;filename=somefile.csv'
writer=csv.writer(response)
writer.writerow(['First row','Foo','Bar'])
writer.writerow(['second row','A','B','C'])
return response
(d)View method middleware
在大多数情况下,在request 和response中的数据都在view 方法中被添加,删除,更新,然而有时候需要对所有requests 和response进行一些操作,比如对所有response 进行强制性安全检查。这时候,用middleware就是个比较好的办法。
middleware 是request/response过程中的钩子框架,也就说,从发起request到返回response,request或response都要经历middleware,因此它可以轻松的改变Django 的输入输出,每个middleware 组件都负责一个特定的功能,比如AuthenticationMiddleware,它通过sessions将user和request联结了起来。
有关其机制的小demo见https://www.cnblogs.com/johnyang/p/13592340.html
(4)middleware flash messages:
使用条件:settings.py中MIDDLEWARE包含了django.contrib.messages.middleware.MessageMiddleware;INSTALLED_APPS有django.contrib.messages.value,在TEMPLATES的'OPTIONS'下有django.contrib.messages.context_processors.messages
(a)添加flash message
from django.contrib import messages
messages.add_message(request,message.DEBUG,'the following sql statements were executed') #或者如下方式
messages.debug(request,'The following sql statements were executed')
需要注意的是,默认情况上面两个会被忽略,因为Django默认处理INFO层以上的信息,所谓层就是不同message对应的value,而DEBUG小于该值,所以默认被忽略,message-->value如下:
DEBUG-->10 (最低);INFO-->20;SUCCESS-->25;WARNING-->30;ERROR-->40(最高);
更改message level:
#globally, settings.py
from django.contrib.messages import constant as message_constants
MESSAGE_LEVEL=message_constants.DEBUG #set default Djanog message level on a per request basis,in some method defined in views.py
from django.contrib import messages
def index(request):
messages.set_level(request,messages.SUCCESS)
messages.add_message(request,messages.INFO,'it is info')
return render(request,'banners/index.html')
(b)Access Flash messages
message的属性有'message': message中的实际文本;‘level':数字;’level_tag':字符代表,比如对于INFO,就是'info'。
可通过template来访问:
{% extends '../base.html' %}
{% block body_block %}
<!-- {% url 'banners_adverts:index' %} -->
{% if messages %}
<ul class="messages">
{% for msg in messages %}
<li>
<div class="alert alert-{{msg.level_tag}}" role="alert">
{{msg.message}}
</div>
</li>
{% endfor %}
</ul>
{% endif %}
{% endblock %}
其中base.html是带有bootstrap的html,效果如下:

(5)CBV(class-based-views)
django.views.generic.View:所有其他CBV的父类,若创建一个继承该类的类,则可以自定义get(),post()方法来应对request的get和post方法。
django.views.generic.TemplateView:允许一个url,而不需要一个view方法,当然也可以通过在views.py中创建一个继承该类的类,然后设定类属性template_name,类方法get_context_data。
需要注意的是在urls.py中,都是需要CBV的as_view()方法
Django 中URL和Views相关知识梳理(极简版)的更多相关文章
- Django中url匹配规则的补充
Django中url匹配规则是在urls.py文件中配置的. 1.关于正则匹配优先级 在url匹配列表中,如果第一条和第二条同时满足匹配规则,则优先匹配第一条. 在url匹配列表中,如果第一条为正则模 ...
- django中url路由配置及渲染方式
今天我们学习如何配置url.如何传参.如何命名.以及渲染的方式,内容大致有以下几个方面. 创建视图函数并访问 创建app django中url规则 捕获参数 路径转换器 正则表达式 额外参数 渲染方式 ...
- django中url 和 path 的区别
django中 url 和 path 都是配置路径,有什么不同? django.urls path django.conf.urls url path 与 url 是两个不同的模块,效果都是响应返回 ...
- zip相关知识梳理(一)
zip相关知识梳理(一) 经过对zip文件的长时间研究,对zip文件进行相关知识进行梳理,虽然网上很多牛人对其做了相关基础解析,但是对于特殊情况没有进行说明,比如超过4G的zip文件该以什么格式进行编 ...
- django 中url与path小记
1. 在django 2.0中增加了一些新的特性 更简单的URL路由语法 (Simplified URL routing syntax) admin应用的针对移动设备的优化改进(Mobile-frie ...
- Django——URL详解/Django中URL是如何与urls文件匹配的
URL标准语法 protocol://hostname[:port]/path/[:parameters][?query]#fragment https://i.cnblogs.com/EditPos ...
- 由char和byte的关系引申出去——总结一下java中的字符编码相关知识
由char和byte的关系引申出去--总结一下java中的字符编码相关知识 一.字符编码 手持两把锟斤拷,口中直呼烫烫烫 在文章伊始,先来复习一下计算机中关于编码的一些基础知识,着重理清以下几 ...
- java中String类型的相关知识的简单总结
java中String类型的相关知识总结 一.常用方法: 1.构造方法: byte数组 可指定offset和length 可指定charset char数组 可指定offset和count 字符序列 ...
- 在Web应用中接入微信支付的流程之极简清晰版
在Web应用中接入微信支付的流程之极简清晰版 背景: 在Web应用中接入微信支付,我以为只是调用几个API稍作调试即可. 没想到微信的API和官方文档里隐坑无数,致我抱着怀疑人生的心情悲愤踩遍了丫们布 ...
- 在Web应用中接入微信支付的流程之极简清晰版 (转)
在Web应用中接入微信支付的流程之极简清晰版 背景: 在Web应用中接入微信支付,我以为只是调用几个API稍作调试即可. 没想到微信的API和官方文档里隐坑无数,致我抱着怀疑人生的心情悲愤踩遍了丫们布 ...
随机推荐
- C# List LinQ Lambda 表达式
------------恢复内容开始------------ # 参考链接 : https://blog.csdn.net/wori/article/details/113144580 首先 => ...
- 用于敏捷开发的最佳免费 UML 工具 2022
Table of Contents hide 1 最好的在线免费 UML图工具 2 免费的 UML Visual Paradigm 在线平台 3 其他福利 4 用于正式和大规模可视化建模的 Vis ...
- 使用Windows系统自带DLL修复工具修复系统缺失dll的问题
1. System File Checker(SFC) System File Checker(SFC)是Windows自带的一个工具,可以扫描系统文件并尝试修复任何受损的文件.要使用SFC,请按照以 ...
- flutter - [01] Dart概述
题记部分 一.什么是dart dart是由谷歌开发的计算机编程语言,可以被用于web.服务器.移动应用和物联网等领域的开发 dart诞生于2011年,号称要取代JavaScript.但是过去的几年中一 ...
- 7. Nginx 工作机制&参数设置(详细讲解说明)
7. Nginx 工作机制&参数设置(详细讲解说明) @ 目录 7. Nginx 工作机制&参数设置(详细讲解说明) 1. Nginx 当中的 master-worker 机制原理 2 ...
- redux vs redux-toolkit 及源码实现
我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:霜序 前言 为何讲这个内容?以为后续大家会使用 redux ...
- 【Python脚本】刚度矩阵格式转换
对于1-2-3坐标系: 应力矩阵如下: \[\left.[\sigma]=\left[\begin{array}{ccc}\sigma_{11}&\sigma_{12}&\sigma_ ...
- 【MIPS】经典指令块集锦
Directives声明变量值存储 容易将数据段地址和地址上的内容搞混 .data fibs: .space 48 # allocate 12 * 4 = 48 Byte memory, store ...
- 微信小程序分包体积优化建议
代码包体积优化 启动性能优化最直接的手段是降低代码包大小,代码包大小直接影响了下载耗时,影响用户启动小程序时的体验. 开发者可以采取以下手段优化代码包体积: 1. 合理使用分包加载 推荐所有小程序使用 ...
- 连接MySQL数据库出现时Authentication plugin 'caching_sha2_password' cannot be loaded的解决办法
问题描述:用Navicat Premium或HeidiSQL连接MySQL数据库时会弹出下面的情况 解决方法: 1.运行命令行窗口,输入以下命令,输入密码后进入到mysql中,(最好将MySQL安装目 ...