提示:仅供梳理参考,很多相关的细节内容忽略。

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相关知识梳理(极简版)的更多相关文章

  1. Django中url匹配规则的补充

    Django中url匹配规则是在urls.py文件中配置的. 1.关于正则匹配优先级 在url匹配列表中,如果第一条和第二条同时满足匹配规则,则优先匹配第一条. 在url匹配列表中,如果第一条为正则模 ...

  2. django中url路由配置及渲染方式

    今天我们学习如何配置url.如何传参.如何命名.以及渲染的方式,内容大致有以下几个方面. 创建视图函数并访问 创建app django中url规则 捕获参数 路径转换器 正则表达式 额外参数 渲染方式 ...

  3. django中url 和 path 的区别

    django中 url 和 path 都是配置路径,有什么不同? django.urls path django.conf.urls  url path 与 url 是两个不同的模块,效果都是响应返回 ...

  4. zip相关知识梳理(一)

    zip相关知识梳理(一) 经过对zip文件的长时间研究,对zip文件进行相关知识进行梳理,虽然网上很多牛人对其做了相关基础解析,但是对于特殊情况没有进行说明,比如超过4G的zip文件该以什么格式进行编 ...

  5. django 中url与path小记

    1. 在django 2.0中增加了一些新的特性 更简单的URL路由语法 (Simplified URL routing syntax) admin应用的针对移动设备的优化改进(Mobile-frie ...

  6. Django——URL详解/Django中URL是如何与urls文件匹配的

    URL标准语法 protocol://hostname[:port]/path/[:parameters][?query]#fragment https://i.cnblogs.com/EditPos ...

  7. 由char和byte的关系引申出去——总结一下java中的字符编码相关知识

    由char和byte的关系引申出去--总结一下java中的字符编码相关知识 一.字符编码 手持两把锟斤拷,口中直呼烫烫烫 ​   在文章伊始,先来复习一下计算机中关于编码的一些基础知识,着重理清以下几 ...

  8. java中String类型的相关知识的简单总结

    java中String类型的相关知识总结 一.常用方法: 1.构造方法: byte数组 可指定offset和length 可指定charset char数组 可指定offset和count 字符序列 ...

  9. 在Web应用中接入微信支付的流程之极简清晰版

    在Web应用中接入微信支付的流程之极简清晰版 背景: 在Web应用中接入微信支付,我以为只是调用几个API稍作调试即可. 没想到微信的API和官方文档里隐坑无数,致我抱着怀疑人生的心情悲愤踩遍了丫们布 ...

  10. 在Web应用中接入微信支付的流程之极简清晰版 (转)

    在Web应用中接入微信支付的流程之极简清晰版 背景: 在Web应用中接入微信支付,我以为只是调用几个API稍作调试即可. 没想到微信的API和官方文档里隐坑无数,致我抱着怀疑人生的心情悲愤踩遍了丫们布 ...

随机推荐

  1. 启动U盘制作-小白保姆式超详细刷机教程

    疑难解答加微信机器人,给它发:进群,会拉你进入八米交流群 机器人微信号:bamibot 简洁版教程访问:https://bbs.8miyun.cn 一.准备工作 需要用到的工具: 1.一台Window ...

  2. 批量上传序列到Gisaid数据库

    本文演示的是用Gisaid官网自带的Excel宏批量上传毒株信息和序列到Gisaid数据库,需要魔法. 1. 下载GISAID Batch Uploader 找到自己需要上传的病毒类型,我是Flu,在 ...

  3. java.lang.IllegalStateException: File name has been re-used with different files. (flume报错)

    报错日志: java.lang.IllegalStateException: File name has been re-used with different files. Spooling ass ...

  4. Opera打不开网页解决办法

    打开目录C:\Users\用户名\AppData\Roaming\Opera Software\Opera Stable 2.查找{"country":"CN" ...

  5. tinyint、int的区别

    1.tinyint(1字节--4位[带符号]) 很小的整数.带符号的范围是-128到127.无符号的范围是0到255. 2.smallint(2字节--6位[带符号]) 小的整数.带符号的范围是-32 ...

  6. MySQL索引最左原则:从原理到实战的深度解析

    MySQL索引最左原则:从原理到实战的深度解析 一.什么是索引最左原则? 索引最左原则是MySQL复合索引使用的核心规则,简单来说: "当使用复合索引(多列索引)时,查询条件必须从索引的最左 ...

  7. Docker之一简介

    什么是Docker Docker是Google使用go语言进行开发的,对进程进行封装隔离,始于操作系统层面的虚拟化技术. 因为隔离的进程独立于宿主机和其它的隔离进程,因此成为容器 Docker在容器的 ...

  8. wordpress:nginx负载均衡+nignweb服务器+mysql数据库+nfs-lsync+rsync备份

    目录 所有知识结合,注意正式环境慎用: mariadb服务器 NFS服务器配置 web服务器配置 Nginx负载均衡 backup备份服务器配置rsync NFS服务器安装lsync进行实时同步 所有 ...

  9. Sa-Token v1.41.0 发布 🚀,来看看有没有令你心动的功能!

    Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证.权限认证.单点登录.OAuth2.0.微服务网关鉴权 等一系列权限相关问题. 目前最新版本 v1.41.0 已推送至 Mav ...

  10. String类的特点

    1.String类的特点 1.java程序中,只要是双引号字符串,就都是String类的对象 如图 只有String这一个类有这种特殊的创建对象方法 我们知道,只有对象才可以通过 点什么来调用方法,而 ...