一.URL控制系统 1.简单说明 URL配置的本质是通过URL与对应的View视图形成映射,我们在调用URL时会自动找到对应的view进行逻辑处理,及通过URL告诉Django调用那一段View代码. 2.格式 urlpatterns = [ url(‘正则表达式URL1’,views视图函数,[参数],[别名]), url(‘正则表达式URL2’,views视图函数,[参数],[别名]), ] 参数说明: 一个正则表达式字符串,Django会从上往下一次匹配url,匹配有值则停止往下查找; 一个可调用的视图函数 可选的要传给视图函数的默认参数(字典形式) 一个可选的别名name参数,如果有了别名,在调用时可以直接用该别名,这样修改URL,其他使用别名的应用则不用修改 例如:

3.命名分组函数 命名分组函数分为:有命名分组函数和无命名分组函数,他们是通过url中的正则表达式(表达式中带小括号进行分组)是否指定名字来区分。正则表达式分组并指定了名字则为有命名分组函数,正则表达式分组但未指定了名字则为无命名分组函数。 3.1 不属于两者范畴 3.2 无命名分组函数 3.3 有命名分组函数

效果图: 4.别名 我们通过,url来映射url与view视图之间的关联,如果其他地方需要用到我们的url时,我们可以直接进行引用,例如在form表单中,点击提交之后可以使用action来跳转到另外一个url,此时我们可以直接在form的action中直接引用需要的url。但是如果直接引用,则有以下不合理的地方: a.随着url中url地址的修改则需要修改所有到它的地方,可能会有遗漏的地方; b.如果url地址比较长时,则所有引用的地方均需要进行重复编写,此时量比较大; 此时,我们可以直接使用别名的形式进行处理,如图url别名设置:

引用方式如图: 5.Url路由分发 在前面所有的例子中,我们只有一个app应用,如果一个项目有多个不同app引用时,我们把所有的url都放在urls.py中,不仅会显得十分混乱而且有时还会影响正常功能的使用(比如APP1中有一个url有问题,但是APP2中所有url正常,此时APP1将会影响APP2的正常使用)。此时,我们可以使用url路径分发机制来处理,如图: 项目的url(项目中统筹向下分发的url):

APP应用中的url设置: 6.

二.View视图函数 View主要是用来处理逻辑的模块,web中通过接受请求并处理请求并将处理的结果返回给请求对象。其中主要是通过http协议来完成请求的。 HTTP请求中产生两个核心对象: http请求:HttpRequest对象; http响应:HttpResponse对象; http模块的位置是在django.http中。 1.HttpRequest HttpRequest对象是由django框架内部自己自动创建的,我们在定义每个方法时必须要带上它,名字可自定义,但建议使用request。也就是说,django的view模块中所有定义的函数,必须带上一个request的参数,且request是django在接收到请求后自己创建的对象。HttpRequest对象的属性和方法实际上就是这个request的属性和方法。 HttpRequest对象的主要方法: 1.1 Request.method: http请求的方法类别,分为GET和POST两种; 1.2 request.GET.get('key'):http通过GET请求传到HttpRequest的字典对象,再用get方法通过关键字获取对应的value; 1.3 request.POST.get('key'):http通过POST请求传到HttpRequest的字典对象,再用get方法通过关键字获取对应的value; 1.4 Request.path:获取url的链接,返回值不带参数; 1.5 request.get_full_path():获取url的链接,若是通过get传输,则此处的值返回的是带参数值的url; 如图: 1.6 2.HttpResponse对象 对于HttpResponse对象来说,它和HttpRequest对象不同,前者必须要自己创建,而后者是django自己自动创建的。每个view请求的处理方法必须返回一个HttpResponse。 HttpResponse对象的常用方法: 2.1 HttpResponse():将内容返回到页面上,此处不需要加request参数,如图: 2.2 render():页面渲染(将html经过django后台处理后将页面效果渲染到浏览器中),推荐使用。 格式: render(request,’前端.html’)注:request参数必带; 例如: 注:其实,render()最终返回的依然是一个HttpResponse对象,源代码如下图所示: 2.3 render_to_response():也是页面渲染(将html经过django后台处理后将页面效果渲染到浏览器中) 格式:render_to_response(’前端.html’),与render()作用一样,但render_to_response()不需要带request,且render_to_response()在使用工程中可能出现问题。推荐使用render()方法。 例如: 注:其实,render()最终返回的依然是一个HttpResponse对象,源代码如下图所示: 3.View中局部变量加载到template(html文件)中的两种方式 a.通过key:value键值对字典的形式通过key获取到对应的value并加载到对应的HTML文件中,如图所示: 对应的HTML引用view中变量的方式如图所示: 此方法如果HTML中有N多个需要获取view中的局部变量时,则写的key/value键值对将添加很多,此时会比较麻烦,但是在实际使用过程中,我们在view中定义的局部变量并不会很多,推荐使用该种方式。 b.通过locals()函数将view中的所有局部变量都加载到HTML中,如图所示: 对应的HTML文件加载view中的参数方式如图所示: 此时,view中使用什么变量名,HTML中也就使用相同的变量名,此时不再使用key获取对应的value值的方式。 4.redirect() redirect()是跳转到某一个指定的url,参数为指定要跳转的url;如图所示: 内部原理:使用redirect(url)进行跳转时,先去对应的url.py中匹配对应的redirect中指定的url,匹配成功后再去查找url对应的view函数并执行该函数。 注意:redirect()与render()的区别: A.redirect()中必须跟的是url路径,而render()中必须是需要渲染的html文件名称; B.redirect()跳转之后,url会变成redirect(url)指定跳转的url,而使用render()则url不会发生变化。 如图:

三.相关代码地址 https://github.com/DoneZj/django3.git

欢迎关注笔者个人公众号: